Sign in Join
Wiki copytemporary

Lazarus Database Tutorial/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Lazarus Database Tutorial/ru

OldNewLine
1+## Обзор
2+
3+Это руководство по работе с различными базами данных в Lazarus. Lazarus поддерживает множество баз данных с помощью внешних пакетов, разработчик должен установить соответствующий пакет для каждой из них. Вы можете получить доступ к базе данных путем написания соответствующего кода или используя компоненты в форме. Компоненты доступа к данным представляют поля и подключаются путем установки свойства DataSource, которое представляет таблицу и подключается к компонентам баз данных, например TPSQLDatabase, TSQLiteDataSet путем установки свойства DataSet. Компоненты доступа к данным располагаются на вкладке "Data Controls". Источники данных и компоненты доступа к базам данных располагаются на вкладке "Data Access".
4+
5+## Lazarus и MySQL
6+
7+### Получение работающего MySQL в Linux или Windows
8+
9+Следуйте инструкциям в Руководстве пользователя MySQL. Убедитесь в том, что демон mysqld работает надежно, и в том, что все потенциальные пользователи (в том числе root, mysql, вы сами и все остальные, кому это может понадобиться) имеют столько привилегий, сколько им нужно (настолько, насколько это согласуется с безопасностью). Желательно, чтобы все пользователи, включая root, имели пароли. Проверьте действия в системе базы данных, используя примеры, приведенные в руководстве, и убедитесь, что все пользователи действительно имеют надежный доступ.
10+
11+### Работа с MySQL в текстовом режиме
12+
13+В каталоге \$(fpcsrcdir)/packages/base/mysql/ лежит пример программы. Исходники fpc в Lazarus найти можно через меню Окружение –\> Настройки окружения –\> Закладка Файлы –\> Каталог исходного кода FPC. Возможные пути для mysql каталога /usr/share/fpcsrc/packages/base/mysql/ (rpm install), или C:\lazarus\fpcsrc\packages\base\mysql\\ (windows). Этот каталог содержит также модули mysql.pp, mysql_com.pp и mysql_version.pp. Прежде чем запустить тестовый скрипт, нужно создать базу данных с именем testdb: сделайте это, войдя в mysql монитор (в качестве root с полным набором прав), и выполните следующую команду SQL
14+
15+`CREATE DATABASE testdb;`
16+
17+Затем убедитесь, что все соответствующие пользователи имеют соответствующие права доступа к этой базе данных
18+
19+`GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; `
20+
21+Существует скрипт, называемый mkdb, попробуйте его запустить:
22+
23+`sh ./mkdb`
24+
25+Скорее всего, из этого ничего не выйдет, потому что система не позволит анонимному пользователю получить доступ к базе данных. Измените скрипт с помощью текстового редактора таким образом, чтобы строка запуска mysql выглядела так:
26+
27+`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
28+
29+и запустите его еще раз, когда появится запрос – введите пароль. Возможно, вам удалось создать тестовую базу данных, проверьте ее, войдя в mysql монитор и введя следующую команду
30+
31+`select * from FPdev;`
32+
33+Вы увидите таблицу с ID, именами пользователя и email-адресами некоторых разработчиков FPC.
34+
35+Теперь попробуйте запустить тестовую программу testdb.pp (возможно, придется ее скомпилировать и весьма вероятно, что с первой попытки это не удастся!!).
36+
37+Я обнаружил, что программа не может соединиться с mysql по нескольким причинам:
38+
39+- Моя система (SuSE Linux v9.0) содержит mysql v4.0.15, а не версию 3, для которой был разработан пакет доступа к mysql.
40+- Программе требуется имя пользователя и пароль для доступа к базе данных.
41+- Компилятору хочется знать, где можно найти библиотеки mysql (ЕСЛИ ВЫ ДО СИХ ПОР НЕ УСТАНОВИЛИ БИБЛИОТЕКИ РАЗРАБОТЧИКА MYSQL, СДЕЛАЙТЕ ЭТО ПРЯМО СЕЙЧАС!)
42+
43+Я создал копию testdb.pp с именем trydb.pp, не редактируя оригинал – это означает, что исходные файлы еще получат исправления в последующих обновлениях CVS. Также я скопировал файлы в каталоге mysql/ver40/ в основной каталог mysql/, переименовав их в mysql_v4.pp, mysql_com_v4.pp и mysql_version_v4.pp, будучи уверенным в переименовании каждого модуля соответственно. Я изменил uses в trydb.pp на
44+
45+`uses mysql_v4`
46+
47+и в mysql_v4.pp на
48+
49+`uses mysql_com_v4`
50+
51+Я добавил строку в /etc/fpc.cfg, показывающую на мои библиотеки:
52+
53+`-Fl/lib;/usr/lib`
54+
55+В следующем шаге, возможно, не будет необходимости, если библиотеки разработчика установлены в качестве ссылок, но проверить не помешает. Мне пришлось найти подлинное имя из библиотеки mysqlclint в /usr/lib каталоге, и в моем случае мне пришлось выдать команду:
56+
57+`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
58+
59+чтобы создать символическую ссылку, позволяющую FPC найти библиотеку. Также я создал ссылку
60+
61+`ln -s libmysqlclient.so.12.0.0 mysqlclient`
62+
63+и поместил аналогичные ссылки в других каталогах: не то, чтобы очень уж необходимо, но на всякий случай. Некоторым пользователям, возможно, придется добавить следующую ссылку
64+
65+`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
66+
67+Я изменил trydb.pp – включил реквизиты пользователя, стартовый хост, имя пользователя и пароль как константы:
68+
69+`const`\
70+` host : Pchar= 'localhost';`\
71+` user : Pchar= 'myusername';`\
72+` passwd: Pchar = 'mypassword';`
73+
74+Я также обнаружил, что не могу соединиться с mysql, используя вызов mysql_connect() и мне приходится использовать вызов функции mysql_real_connect(), которая имеет гораздо больше параметров. Дальнейшее осложняется тем, что количество параметров изменилось между версией 3 (их было семь) и версией 4 (стало восемь). Перед использованием mysql_real_connect мне пришлось использовать mysql_init(), который не нашелся в оригинале mysql.pp но имеется в mysql_v4.pp.
75+
76+Ну вот и код для подключения к базе данных:
77+
78+`{ a few extra variables}`\
79+`var`\
80+`  alloc : PMYSQL;`\
81+\
82+`{main program fragment}`\
83+\
84+`begin`\
85+` if paramcount=1 then`\
86+` begin`\
87+`   Dummy:=Paramstr(1)+#0;`\
88+`   DataBase:=@Dummy[1];`\
89+` end;`\
90+\
91+` Writeln ('Allocating Space...');`\
92+` alloc := mysql_init(PMYSQL(@qmysql));`\
93+` Write ('Connecting to MySQL...');`\
94+` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
95+` if sock=Nil then`\
96+` begin`\
97+`   Writeln (stderr,'Couldnt connect to MySQL.');`\
98+`   Writeln (stderr, 'Error was: ', mysql_error(@qmysql));`\
99+`   halt(1);`\
100+` end;`\
101+` Writeln ('Done.');`\
102+` Writeln ('Connection data:');`\
103+`{$ifdef Unix}`\
104+` writeln ('Mysql_port      : ',mysql_port);`\
105+` writeln ('Mysql_unix_port : ',mysql_unix_port);`\
106+`{$endif}`\
107+` writeln ('Host info       : ',mysql_get_host_info(sock));`\
108+` writeln ('Server info     : ',mysql_stat(sock));`\
109+` writeln ('Client info     : ',mysql_get_client_info);`\
110+\
111+` Writeln ('Selecting Database ',DataBase,'...');`\
112+` if mysql_select_db(sock,DataBase) < 0 then`\
113+` begin`\
114+`   Writeln (stderr,'Couldnt select database ',Database);`\
115+`   Writeln (stderr,mysql_error(sock));`\
116+`   halt (1);`\
117+` end;`\
118+` {... as original contents of testdb.pp}`
119+
120+Теперь готовы к компиляции trydb.pp?
121+
122+`fpc trydb`
123+
124+Успешно! Запускаем:
125+
126+`./trydb`
127+
128+У-у-у-е-е-е-е! Я попал в список разработчиков FPC! Несколько дополнительных уточнений: сделать ввод реквизитов пользователя и mysql команд интерактивным, с помощью переменных, а не констант, и позволить вводить SQL команды, пока не подадим команду выхода: см. полный листинг программы [см. полный листинг программы](http://wiki.lazarus.freepascal.org/Lazarus_Database_Tutorial/TryDbpp), в которой реквизиты пользователя вводятся из консоли, и программа входит в цикл, где SQL команды вводятся в консоли (без закрывающей запятой), и результаты выводятся до тех пор, пока с клавиатуры не будет введена команда "quit". Листинг консольного вывода [здесь](http://wiki.lazarus.freepascal.org/Lazarus_Database_Tutorial/SampleListingSee)
129+
130+### Подключение к MySQL из приложения Lazarus
131+
132+Данное руководство показывает, как Lazarus подключается к базе данных MySQL и выполняет простые запросы, используя основные компоненты Lazarus. Использования компонент отображения данных не будет, покажем только принцип взаимодействия с базами данных.
133+
134+Создайте новый проект в Lazarus:
135+
136+`Project -> New Project -> Application`
137+
138+Автоматически сгенерируется новая форма..
139+
140+Растяните форму на пол-экрана и переименуйте ее и ее заголовок в 'TryMySQL'.
141+
142+Расположите на форме сверху слева три компонента TEdit с вкладки Standard и над каждым из них поместите компонент TLabel. Задайте им заголовки 'Host' (и имена HostLLabel, HostEdit), 'UserName' (UserLabel, UserEdit) и 'Password' (PasswdLabel и PasswdEdit). Как вариант вы можете использовать компонент TLabelledEdit с закладки Additional.
143+
144+Найдите свойство PasswordChar у компонента PasswdEdit, измените его на * или любой другой символ, это приведет к тому, что когда вы вводите пароль, то вместо пароля будет отображаться именно этот символ (несколько символов). Убедитесь, что свойство Text у этого компонента не содержит текста.
145+
146+Теперь расположите еще один компонент Tedit и TLabel в правом верхнем углу формы. Измените заголовок на 'Enter SQL Command' и переименуйте компонент в CommandEdit.
147+
148+Поместите на форму три кнопки, две слева под компонентами TEdit и одну справа под компонентом для команд.
149+
150+Измените свойства Label (Name) левых кнопок на 'Connect to Database' (ConnectButton) и 'Exit' (ExitButton) и правой - 'Send Query' (QueryButton).
151+
152+Расположите большой TMemo с заголовком 'Results' (ResultMemo) слева внизу так, чтобы он заполнил все оставшееся место. Найдите свойство ScrollBars и установите значение ssAutoBoth, чтобы компонент мог прокручивать текст и вертикально и горизонтально. Свойство WordWrap установите в True.
153+
154+Поместите на форму статусную строку (TStatusBar с закладки Common Controls) внизу формы и впишите в свойство SimpleText строку 'TryMySQL'.
155+
156+[Вот что должно получится](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png)
157+
158+Теперь нам потребуется написать несколько обработчиков.
159+
160+У нас на форме слева три компонента TEdit для ввода имени хоста, пользователя и пароля. Как только в них будут введены необходимые данные, нужно нажать на кнопку Connect. Обработчик OnClick для этой кнопки частично базируется на модуле для FPC, который мы привели выше.
161+
162+Результаты запросов к базе данных не могут быть сразу выведены с помощью операторов Pascal write или writeln, сначала их необходимо преобразовать в строки и вывести в компонент TMemo.
163+
164+Хотя операторы Pascal write и writeln и приспособлены для преобразования типов «на лету», использование компонента TMemo для вывода текста требует прямого преобразования типов в строковую форму, так переменные типа Pchar должны быть преобразованы в строки путем использования StrPas, и числа должны конвертироваться функцией IntToStr.
165+
166+Добавим строки в TMemo используя
167+
168+`procedure ShowString (S : string);`\
169+`(* display a string in a Memo box *)`\
170+`begin`\
171+`      trymysqlForm1.ResultsMemo.Lines.Add (S)`\
172+`end;`
173+
174+Таким образом, обработчик ConnectButton становится следующим:
175+
176+`procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);`\
177+`(* Connect to MySQL using user data from Text entry boxes on Main Form *)`\
178+`var strg: string;`\
179+\
180+`begin`\
181+\
182+` dummy1 :=  trymysqlForm1.HostEdit.text+#0;`\
183+` host := @dummy1[1];`\
184+` dummy2 := trymysqlForm1.UserEdit.text+#0;`\
185+` user := @dummy2[1] ;`\
186+` dummy3 := trymysqlForm1.PasswdEdit.text+#0;`\
187+` passwd := @dummy3[1] ;`\
188+` alloc := mysql_init(PMYSQL(@qmysql));`\
189+` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
190+` if sock=Nil then`\
191+`   begin`\
192+`     strg :='Couldnt connect to MySQL.'; showstring (strg);`\
193+`     Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);`\
194+`  end`\
195+`   else`\
196+`   begin`\
197+`     trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';`\
198+`     strg := 'Now choosing database : ' + database; showstring (strg);`\
199+`{$ifdef Unix}`\
200+`     strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);`\
201+`     strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);`\
202+`{$endif}`\
203+`     Strg :='Host info       : ' + StrPas(mysql_get_host_info(sock));`\
204+`     showstring (strg);`\
205+`     Strg :='Server info     : ' + StrPas(mysql_stat(sock)); showstring (strg);`\
206+`     Strg :='Client info     : ' + Strpas(mysql_get_client_info);  showstring (strg);`\
207+` `\
208+`     trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';`\
209+` if mysql_select_db(sock,DataBase) < 0 then`\
210+` begin`\
211+`   strg :='Couldnt select database '+ Database; ShowString (strg);`\
212+`   Strg := mysql_error(sock); ShowString (strg);`\
213+` end`\
214+` end;`\
215+`end;`
216+
217+Поле для ввода справа позволяет вводить команды SQL без завершающей точки-с-запятой; как только вы удовлетворитесь синтаксисом - жмите кнопку SendQuery - запрос выполнится и результат будет отображен в компоненте ResultsMemo.
218+
219+Обработчик SendQuery опять же базируется на версии FPC, за исключением использования преобразования типов для последующего отображения строк.
220+
221+Разница между программой на FPC и этой программой в том, что в случае возникновения ошибки программа на Free Pascal завершит свою работу и сессия MySQL останется открытой, в то же время во второй программе контроль вернется в главную форму и можно повторить попытку. В конечном итоге приложение нормально завершает свою работу (закрывая при этом сессию MySQL) при нажатии кнопки Exit.
222+
223+Ниже приведен код обработчика кнопки SendQuery:
224+
225+`procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);`\
226+`var`\
227+` dumquery, strg: string;`\
228+`begin`\
229+`    dumquery := TrymysqlForm1.CommandEdit.text;`\
230+`    dumquery := dumquery+#0;`\
231+`    query := @dumquery[1];`\
232+`    trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';`\
233+`    strg := 'Executing query : ' + dumQuery; showstring (strg);`\
234+`    if (mysql_query(sock,Query) < 0) then`\
235+`    begin`\
236+`      Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);`\
237+`    end`\
238+`    else`\
239+`    begin`\
240+`      recbuf := mysql_store_result(sock);`\
241+`      if RecBuf=Nil then`\
242+`      begin`\
243+`        Strg :='Query returned nil result.'; showstring (strg);`\
244+`      end`\
245+`      else`\
246+`      begin`\
247+`        strg :='Number of records returned  : ' + IntToStr(mysql_num_rows (recbuf));`\
248+`        Showstring (strg);`\
249+`        Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));`\
250+`        showstring (strg);`\
251+`        rowbuf := mysql_fetch_row(recbuf);`\
252+`        while (rowbuf <>nil) do`\
253+`        begin`\
254+`             Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +`\
255+`              rowbuf[2] +')';`\
256+`             showstring (strg);`\
257+`             rowbuf := mysql_fetch_row(recbuf);`\
258+`        end;`\
259+`      end;`\
260+`    end;`\
261+`end;`
262+
263+Сохраните свой проект и жмите Запуск -\> Запуск
264+
265+Полный листинг программы доступен [тут](http://lazarus-ccr.sourceforge.net/kbdata/mysqldemo.tar.gz)
266+
267+## Lazarus и PostgreSQL
268+
269+Очень краткое руководство по подключению Lazarus 0.9.12 (или более поздней версии) к базе данных PostgreSQL, локально или удаленно, используя компонент TPQConnection.
270+
271+- После корректной установки, выполните следующие шаги:
272+ - Поместите на форму компоненты PQConnection, SQLQuery, SQLTransaction с вкладки SQLdb
273+ - Поместите компонент DataSource с вкладки DataAccess
274+ - Поместите DBGrid с вкладки DataControls
275+
276+- В компоненте PQConnection заполните свойства:
277+ - transaction – ссылкой на объект SQLTransaction
278+ - DatabaseName
279+ - HostName
280+ - UserName + password
281+
282+Проверьте, что SQLTransaction автоматически привязался к PQConnection
283+
284+- В компоненте SQLQuery заполните свойства:
285+ - transaction соответствующим объектом
286+ - database
287+ - SQL (что-то вроде 'select * from anytable')
288+
289+В компоненте DataSource установите свойство DataSet который должен указываить на объект SQLQuery В компоненте DBGrid установите в свойстве datasource указатель на объект DataSource Включайте и активируйте все. DBGrid должен показать данные прямо во время разработки. TDBText и TDBEdit работают, но у меня только отображают данные. Для внесения изменений в базу данных я вызываю запрос вставки для базы напрямую, используя следующий код:
290+
291+`try`\
292+`  sql:= 'UPDATE table SET setting=1';`\
293+`  PQDataBase.Connected:=True;`\
294+`  PQDataBase.ExecuteDirect('Begin Work;');`\
295+`  PQDataBase.ExecuteDirect(sql);`\
296+`  PQDataBase.ExecuteDirect('Commit Work;');`\
297+`  PQDataBase.Connected:=False;`\
298+`except`\
299+`  on E : EDatabaseError do`\
300+`    MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
301+`  on E : Exception do`\
302+`    MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
303+`end;`
304+
305+Примечания: Проверено в Windows, Lazarus 0.9.12 + PgSQL 8.3.1 Некоторые тесты в linux, Lazarus 0.9.12 и PgSQL 8.0.x
306+
307+Установка и ошибки: В тестируемой версии Lazarus .12, поля типа "text" и "numeric" имеют ошибки Я без проблем использовал строки фиксированной длины, int и float8 Иногда перезапуск Lazarus позволяет обойти тупые ошибки... После каких-то ошибок транзакция может остаться активной и требуется ручное ее закрытие Изменения, сделанные в Lazarus, конечно же не видны до тех пор, пока транзакция не завершена (commit) Встроенный отладчик немного глюкавый (по крайней мере в windows) – иногда внешний (запущенный помимо IDE) может помочь найти ошибки. В Линукс некоторые сообщения об ошибках выводятся в консоль – запускайте вашу программу в командной строке, иногда можно получить немного полезной отладочной информации. Ошибка: "Can not load Postgresql client. Is it installed (libpq.so) ?" Добавьте путь для поиска libpq* из инсталляции PostgreSQL. В Linux добавьте путь к файлу libpq.so в секцию libraries в файле /etc/fpc.cfg file. Например: -Fl/usr/local/pgsql/lib В windows, добавьте пути к библиотекам в переменную Path или в папку проекта В windows я копировал все DLLs из папки C:\Program Files\PostgreSQL\8.1\bin в папку, которая была в переменной PATH Или добавьте папку postgres\bin в path.
308+
309+## Lazarus и SQLite
310+
311+Luiz Américo
312+
313+Посетите страничку [sqlite4fpc](http://sqlite4fpc.yolasite.com/), чтобы найти описание API и дополнительную документацию.
314+
315+TSqliteDataset и TSqlite3Dataset сейчас входят в стандартную поставку Lazarus.
316+
317+### Введение
318+
319+TSqliteDataset и TSqlite3Dataset являются потомками TDataset, предоставляющими доступ к базам данных SQLite версий 2.8.x и 3.x.x соответственно. Ниже перечислены основные достоинства и недостатки:
320+
321+Достоинства:
322+
323+- Гибкость: программист может выбирать - использовать или нет язык SQL, что позволяет ему работать с простым макетом таблицы или с комплексным макетом любой сложности, насколько это позволяет SQL/sqlite
324+- Автоматическое обновление данных: нет необходимости обновлять данные вручную, используюя команды SQL - один метод берет на себя все заботы
325+- Скорость: данные кэшируются в оперативной памяти, что позволяет быстрее просматривать данные
326+- Не требуется установка/настройка сервера: просто поставляйте программу вместе с библиотекой sqlite
327+
328+Недостатки:
329+
330+- Требуется дополнительный файл (библиотека sqlite).
331+
332+### Требования
333+
334+- Для баз данных sqlite2:
335+ - fpc 2.0.0 или выше
336+ - Lazarus 0.9.10 или выше
337+ - runtime-библиотека sqlite 2.8.15 или выше (можно взять с [www.sqlite.org](http://www.sqlite.org))
338+
339+- Для баз данных sqlite3:
340+ - fpc 2.0.2 или выше
341+ - Lazarus 0.9.11 (svn revision 8443 или выше)
342+ - runtime-библиотека sqlite 3.2.1 или выше (можно взять с [www.sqlite.org](http://www.sqlite.org))
343+
344+Прежде чем начать проект lazarus, убедитесь что:
345+
346+- библиотека sqlite доступна по пути PATH или находится в каталоге программы
347+- под Linux, используйте cmem первым модулем в предложении uses главной программы (модуля проекта)
348+ - В Debian, Ubuntu и других Debian-like дистрибутивах (также относится к OpenSuse), в целях сборки Lazarus IDE вы должны установить пакеты libsqlite-dev/libsqlite3-dev, не только sqlite/sqlite3.
349+
350+### Как работать (Основы)
351+
352+Установите пакет из каталога /components/sqlite (смотрите инструкцию) (Пакет → Настройка установленных пакетов → установить sqlite3laz)
353+
354+Во время разработки установите следующие свойства:
355+
356+- FileName: путь к файлу базы данных \[обязательно\]
357+- TableName: название таблицы используемой в sql выражении \[обязательно\]
358+- Sql: SQL select выражение \[необязательно\]
359+
360+**Создание таблицы (Dataset)**
361+
362+Сделайте двойной щелчок мышкой по иконке компонента или используйте пункт 'Create Table' в выпадающем меню, которое появляется после щелчка правой кнопкой мыши по компоненту. Перед Вами появится окно редактора таблицы.
363+
364+Ниже даны все типы данных поддерживаемые TSqliteDataset и TSqlite3Dataset:
365+
366+- Integer
367+- AutoInc
368+- String
369+- Memo
370+- Bool
371+- Float
372+- Word
373+- DateTime
374+- Date
375+- Time
376+- LargeInt
377+- Currency
378+
379+**Получение данных**
380+
381+После создания таблицы, откройте базу данных методом Open. Если свойство SQL не установлено, то будут выбраны все записи из всех полей, что эквивалентно следующему SQL выражению:
382+
383+`SQL:='Select * from TABLENAME'; `
384+
385+**Закрепление изменений в файле базы данных**
386+
387+Используйте метод ApplyUpdates. При этом dataset должно содержать минимум одно поле которое требуется для Первичного Ключа (значения поля должны быть UNIQUE и не NULL) Это возможно достичь двумя путями:
388+
389+- Установите свойство PrimaryKey, дав ему имя поля, которое будет Первичным Ключом
390+- Добавьте поле типа AutoInc (Это поле часто используется в TSqliteDataSet автоматически как Первичный Ключ)
391+
392+Если одно из двух действий выполнено, вызывайте
393+
394+`ApplyUpdates;`
395+
396+PS1: Если выполнены оба действия, то для ApplyUpdates используется поле установленное в свойстве PrimaryKey.
397+
398+PS2: Установка поля в PrimaryKey которое не является Первичным Ключём может привести к повреждению данных при вызове ApplyUpdates. Так же убедитесь, что используемое поле содержит уникальные и не Null значения перед тем как использовать это.
399+
400+### Примечания
401+
402+- Хотя это было проверено с таблицей в 10000 записей и работало прекрасное, однако TSqliteDataset хранит все данные в памяти, так что не забудьте извлекать только необходимые данные (это в первую очередь касается Memo Полей)
403+- Один и тот же файл данных (свойство Filename) может содержать несколько таблиц/наборов данных
404+- Несколько наборов данных (различные комбинации полей) могут быть созданы, используя одну и ту же таблицу одновременно
405+- Возможно фильтровать данные используя оператор WHERE в sql выражении, закрывая и вновь открывая набор данных (или вызывая метод RefetchData). Но в этом случае расположение и число полей должны оставаться одинаковыми
406+- Также возможно применение сложных операторов SQL, используя псевдонимы, объединения, представления из нескольких таблиц (помните, что они должны постоянно находится в том же файле данных), но в этом случае ApplyUpdates не будет работать. Если кто-то хочет использовать сложные запросы и применить обновления файла данных, сообщите мне по почте и я дам некоторые советы, как это сделать
407+- Устанавить имя файла при несозданном sqlite2.x файле данных и если после открыть TSqliteDataset, то это возможно, но у некоторых полей не будут обнаружены правильный тип поля. Они будут обработаны как строковые поля.
408+
409+Примеры для sqlite можно найти в каталоге fpc/fcl/db/sqlite
410+
411+Luiz Américo pascalive(at)bol(dot)com(dot)br
412+
413+## Lazarus и MSSQL
414+
415+На сегодняшний день с MSSQL можно работь через:
416+
417+- встроенный драйвер SQLDB (последний Lazarus/FPC 2.6.1+ из исходников, недоступен как stable download): TMSSQLConnection (MS SQL) и TSybaseConnection (Sybase ASE)
418+- Zeos (свежий CVS, см. ссылки на Zeos на данной странице)
419+- ODBC (MS SQL и Sybase ASE)
420+
421+Пожалуйста, обратитесь к справке FPC и Lazarus, чтобы подробнее узнать про SQLDB для Sybase ASE и MS SQL Server.
422+
423+## Lazarus и Firebird / Interbase
424+
425+Посмотрите [Установка пакетов](http://wiki.lazarus.freepascal.org/Install_Packages). На этой странице расположен небольшой пример для начинающих, как соединиться с сервером FireBird или InterBase.
426+
427+### FBLib Firebird Library
428+
429+[FBLib](http://fblib.altervista.org/) - это OpenSource библитотека для непосредственного доступа к серверу из Borland Delphi / Kylix, Freepascal и Lazarus.
430+
431+Текущая реализация включает:
432+
433+- Непосредственный доступ к Firebird 1.0.x, 1.5.x и 2.0 Classic или SuperServer
434+- Кроссплатформенность \[Win32,Gnu/Linux,FreeBSD)
435+- Автоматический выбор клиентской библиотеки 'fbclient' или 'gds32'
436+- Запросы с параметрами
437+- Поддержка SQL диалектов 1 и 3
438+- LGPL лицензия
439+- Получение метаданных
440+- Простой синтаксический анализатор скриптов
441+- Добавляется только 100-150 KБ к экзешнику
442+- Поддержка BLOB-полей
443+- Выгрузка данных в HTML, SQL-скрипт
444+- Сервисные функции (backup,restore,gfix...)
445+- Обработчик событий
446+
447+Вы можете загрузить документацию с сайта [FBLib's website](http://fblib.altervista.org/).
448+
449+## Lazarus и dBase
450+
451+Tony Maro
452+
453+Вы можете также посетить [[Lazarus Tdbf Tutorial/ru|TDbf Страница руководства]].
454+
455+FPC содержит простой компонент базы данных под названием "TDbf", который функционально подобен компоненту TTable в Delphi ([вебсайт TDbf](http://tdbf.sourceforge.net/)), поддерживающий все основные функции по работе с файлами dBase. Этот компонент не устанавливается по умолчанию, поэтому Вы должны сами установить пакет из каталога "lazarus/components/tdbf" и пересобрать Lazarus. Он появится рядом с компонентом TDatasource на вкладке "Data Access".
456+
457+Компонент TDbf имеет преимущество перед другими компонентами баз данных, т.к. не требует никаких внешних библиотек, однако это не самая лучшая идея для больших приложений баз данных.
458+
459+Компонент очень удобен в применении. Просто поместите TDbf на свою форму, установите путь к каталогу, в котором будут Ваши файлы базы данных, задайте название таблицы, и свяжите его с Вашим компонентом TDatasource.
460+
461+Реальная программа требует немного большего усилия, как бы то ни было. Если таблица ещё не существует, то Вы должны будете её создать программно до открытия. **Примечание**: Версия OpenOffice 2.0x и выше содержит OpenOffice Base, которое может создать dbf файлы более дружественным способом.
462+
463+Попытка открыть несуществующую таблицу вызовет ошибку. Таблицы могут быть созданы программно через компонент после того, как во время выполнения будут заданы путь и название таблицы.
464+
465+Например, чтобы создать таблицу с названием "dvds", чтобы сохранить Вашу dvd коллекцию, Вы поместите компонент на свою форму, установите во время выполнения путь к каталогу с базой и установите название таблицы в "dvds". Получающийся файл будет назван "dvds.dbf". В свой код вставьте такие строки:
466+
467+``` pascal
468+ Dbf1.FilePathFull := '/path/to/my/database';
469+ Dbf1.TableName := 'dvds';
470+ With Dbf1.FieldDefs do begin
471+ Add('Name', ftString, 80, True);
472+ Add('Description', ftMemo, 0, False);
473+ Add('Rating', ftString, 5, False);
474+ end;
475+ Dbf1.CreateTable;
476+```
477+
478+Когда этот код будет выполнен, cоздасться таблица коллекции DVD. После этого данные можно будет отображать в компонентах просмотра данных, связав их через TDatasource с этим компонентом.
479+
480+Добавление индексов является немного отличным от типичного TTable. Это должно быть сделано после того, как база данных открыта. Этот же метод используется и для того, чтобы перестроить индексы. Например:
481+
482+``` pascal
483+ Dbf1.Exclusive := True;
484+ Dbf1.Open;
485+ Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
486+ Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
487+ Dbf1.Close;
488+```
489+
490+Первичный индекс будет файлом с названием "dvdsname.mdx", а второй будет файл с названием "rating.ndx". Однако в базе данных с множеством таблиц, Вы должны позаботиться об уникальности имени файлов индексов.
491+
492+**Примечание**. Для версий dBase, которые поддерживают несколько индексов в одном файле, расширение в имени индекса указывать не надо, только имя индекса. Тогда все индексы будут созданы в одном файле с названием таким же, как и имя таблицы, но с расширением ".mdx".
493+
494+Для того, чтобы указать конкретную версию таблицы, нужно задать свойство TDbf.TableLevel.
495+
496+### Поиск и отображение набора данных
497+
498+Simon Batty
499+
500+В этом примере я хочу найти в базе данных книг все названия, у которых есть автор и затем отобразить список в мемобоксе:
501+
502+``` pascal
503+Dbf1.FilePathFull := '/home/somelocatio/database_location/'; // путь к базе данных
504+ Dbf1.TableName := 'books.dbase'; // файл таблицы, включая расширение
505+ DbF1.Open;
506+ memo1.Clear; // очистка мемобокса
507+
508+ Dbf1.FilterOptions := [foCaseInsensitive];
509+ Df1.Filter := 'AU=' + QuotedStr('anauthor'); // AU это поле, где содержится имя автора
510+
511+ Dbf1.Filtered := true; // Включаем фильтрование
512+ Dbf1.First; // Переходим в начало отфильтрованных данных
513+ while not dbf1.EOF do // В цикле проходим весь полученый набор данных
514+ begin
515+ memo1.Append(Dbf1.FieldByName('TI').AsString); //TI это поле названий
516+ dbf1.next; // Переход на следующую запись
517+ end;
518+
519+Dbf1.Close;
520+```
521+
522+Заметьте, что Вы можете использовать Ddf1.findfirst, чтобы перейти на первую запись в отфильтрованном наборе, затем используйте Dbf1.next, чтобы перемещаться по данным. Я нашел, что использование Dbf1.Findnext подвешивает программуь.
523+
524+## Ссылки, связанные с этой статьей
525+
526+- [[Databases|Создание приложений для баз данных с помощью Lazarus используя модуль DB]]\
527+- [[MySQLDatabases|Создание приложений для баз данных MySQL]]\
528+- [[Zeos tutorial|Создание приложений баз данных с использованием компонентов Zeos]]
529+- [Pascal Data Objects](http://pdo.sourceforge.net) API для доступа к базам данных программами FPC и Delphi, и использующие родную библиотеку MySQL версий 4.1 и 5.0, и Firebird SQL 1.5 и 2.0. Сделано на подобие класса PDO в PHP.
530+
531+## Ответственность и изменения
532+
533+Эта страница сформирована из epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusDatabase).
534+
535+---
536+*From the Free Pascal wiki, page "Lazarus Database Tutorial/ru", as it stood on 2020-02-18 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history