Sign in Join
Wiki copytemporary

Lazarus Database Tutorial/ru: what changed

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

OldNewLine
11## Обзор
22
33Это руководство по работе с различными базами данных в Lazarus. Lazarus поддерживает множество баз данных с помощью внешних пакетов, разработчик должен установить соответствующий пакет для каждой из них. Вы можете получить доступ к базе данных путем написания соответствующего кода или используя компоненты в форме. Компоненты доступа к данным представляют поля и подключаются путем установки свойства DataSource, которое представляет таблицу и подключается к компонентам баз данных, например TPSQLDatabase, TSQLiteDataSet путем установки свойства DataSet. Компоненты доступа к данным располагаются на вкладке "Data Controls". Источники данных и компоненты доступа к базам данных располагаются на вкладке "Data Access".
44
55## Lazarus и MySQL
66
77### Получение работающего MySQL в Linux или Windows
88
99Следуйте инструкциям в Руководстве пользователя MySQL. Убедитесь в том, что демон mysqld работает надежно, и в том, что все потенциальные пользователи (в том числе root, mysql, вы сами и все остальные, кому это может понадобиться) имеют столько привилегий, сколько им нужно (настолько, насколько это согласуется с безопасностью). Желательно, чтобы все пользователи, включая root, имели пароли. Проверьте действия в системе базы данных, используя примеры, приведенные в руководстве, и убедитесь, что все пользователи действительно имеют надежный доступ.
1010
1111### Работа с MySQL в текстовом режиме
1212
1313В каталоге \$(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
1414
1515`CREATE DATABASE testdb;`
1616
1717Затем убедитесь, что все соответствующие пользователи имеют соответствующие права доступа к этой базе данных
1818
1919`GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; `
2020
2121Существует скрипт, называемый mkdb, попробуйте его запустить:
2222
2323`sh ./mkdb`
2424
2525Скорее всего, из этого ничего не выйдет, потому что система не позволит анонимному пользователю получить доступ к базе данных. Измените скрипт с помощью текстового редактора таким образом, чтобы строка запуска mysql выглядела так:
2626
2727`mysql -u root -p  ${1-testdb} << EOF >/dev/null`
2828
2929и запустите его еще раз, когда появится запрос – введите пароль. Возможно, вам удалось создать тестовую базу данных, проверьте ее, войдя в mysql монитор и введя следующую команду
3030
3131`select * from FPdev;`
3232
3333Вы увидите таблицу с ID, именами пользователя и email-адресами некоторых разработчиков FPC.
3434
3535Теперь попробуйте запустить тестовую программу testdb.pp (возможно, придется ее скомпилировать и весьма вероятно, что с первой попытки это не удастся!!).
3636
3737Я обнаружил, что программа не может соединиться с mysql по нескольким причинам:
3838
3939- Моя система (SuSE Linux v9.0) содержит mysql v4.0.15, а не версию 3, для которой был разработан пакет доступа к mysql.
4040- Программе требуется имя пользователя и пароль для доступа к базе данных.
4141- Компилятору хочется знать, где можно найти библиотеки mysql (ЕСЛИ ВЫ ДО СИХ ПОР НЕ УСТАНОВИЛИ БИБЛИОТЕКИ РАЗРАБОТЧИКА MYSQL, СДЕЛАЙТЕ ЭТО ПРЯМО СЕЙЧАС!)
4242
4343Я создал копию testdb.pp с именем trydb.pp, не редактируя оригинал – это означает, что исходные файлы еще получат исправления в последующих обновлениях CVS. Также я скопировал файлы в каталоге mysql/ver40/ в основной каталог mysql/, переименовав их в mysql_v4.pp, mysql_com_v4.pp и mysql_version_v4.pp, будучи уверенным в переименовании каждого модуля соответственно. Я изменил uses в trydb.pp на
4444
4545`uses mysql_v4`
4646
4747и в mysql_v4.pp на
4848
4949`uses mysql_com_v4`
5050
5151Я добавил строку в /etc/fpc.cfg, показывающую на мои библиотеки:
5252
5353`-Fl/lib;/usr/lib`
5454
5555В следующем шаге, возможно, не будет необходимости, если библиотеки разработчика установлены в качестве ссылок, но проверить не помешает. Мне пришлось найти подлинное имя из библиотеки mysqlclint в /usr/lib каталоге, и в моем случае мне пришлось выдать команду:
5656
5757`ln -s libmysqlclient.so.12.0.0 lmysqlclient`
5858
5959чтобы создать символическую ссылку, позволяющую FPC найти библиотеку. Также я создал ссылку
6060
6161`ln -s libmysqlclient.so.12.0.0 mysqlclient`
6262
6363и поместил аналогичные ссылки в других каталогах: не то, чтобы очень уж необходимо, но на всякий случай. Некоторым пользователям, возможно, придется добавить следующую ссылку
6464
6565`ln -s libmysqlclient.so.12.0.0 libmysqlclient.so`
6666
6767Я изменил trydb.pp – включил реквизиты пользователя, стартовый хост, имя пользователя и пароль как константы:
6868
6969`const`\
7070` host : Pchar= 'localhost';`\
7171` user : Pchar= 'myusername';`\
7272` passwd: Pchar = 'mypassword';`
7373
7474Я также обнаружил, что не могу соединиться с mysql, используя вызов mysql_connect() и мне приходится использовать вызов функции mysql_real_connect(), которая имеет гораздо больше параметров. Дальнейшее осложняется тем, что количество параметров изменилось между версией 3 (их было семь) и версией 4 (стало восемь). Перед использованием mysql_real_connect мне пришлось использовать mysql_init(), который не нашелся в оригинале mysql.pp но имеется в mysql_v4.pp.
7575
7676Ну вот и код для подключения к базе данных:
7777
7878`{ a few extra variables}`\
7979`var`\
8080`  alloc : PMYSQL;`\
81-\
81+
8282`{main program fragment}`\
83-\
83+
8484`begin`\
8585` if paramcount=1 then`\
8686` begin`\
8787`   Dummy:=Paramstr(1)+#0;`\
8888`   DataBase:=@Dummy[1];`\
8989` end;`\
90-\
90+
9191` Writeln ('Allocating Space...');`\
9292` alloc := mysql_init(PMYSQL(@qmysql));`\
9393` Write ('Connecting to MySQL...');`\
9494` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
9595` if sock=Nil then`\
9696` begin`\
9797`   Writeln (stderr,'Couldnt connect to MySQL.');`\
9898`   Writeln (stderr, 'Error was: ', mysql_error(@qmysql));`\
9999`   halt(1);`\
100100` end;`\
101101` Writeln ('Done.');`\
102102` Writeln ('Connection data:');`\
103103`{$ifdef Unix}`\
104104` writeln ('Mysql_port      : ',mysql_port);`\
105105` writeln ('Mysql_unix_port : ',mysql_unix_port);`\
106106`{$endif}`\
107107` writeln ('Host info       : ',mysql_get_host_info(sock));`\
108108` writeln ('Server info     : ',mysql_stat(sock));`\
109109` writeln ('Client info     : ',mysql_get_client_info);`\
110-\
110+
111111` Writeln ('Selecting Database ',DataBase,'...');`\
112112` if mysql_select_db(sock,DataBase) < 0 then`\
113113` begin`\
114114`   Writeln (stderr,'Couldnt select database ',Database);`\
115115`   Writeln (stderr,mysql_error(sock));`\
116116`   halt (1);`\
117117` end;`\
118118` {... as original contents of testdb.pp}`
119119
120120Теперь готовы к компиляции trydb.pp?
121121
122122`fpc trydb`
123123
124124Успешно! Запускаем:
125125
126126`./trydb`
127127
128128У-у-у-е-е-е-е! Я попал в список разработчиков FPC! Несколько дополнительных уточнений: сделать ввод реквизитов пользователя и mysql команд интерактивным, с помощью переменных, а не констант, и позволить вводить SQL команды, пока не подадим команду выхода: см. полный листинг программы [см. полный листинг программы](http://wiki.lazarus.freepascal.org/Lazarus_Database_Tutorial/TryDbpp), в которой реквизиты пользователя вводятся из консоли, и программа входит в цикл, где SQL команды вводятся в консоли (без закрывающей запятой), и результаты выводятся до тех пор, пока с клавиатуры не будет введена команда "quit". Листинг консольного вывода [здесь](http://wiki.lazarus.freepascal.org/Lazarus_Database_Tutorial/SampleListingSee)
129129
130130### Подключение к MySQL из приложения Lazarus
131131
132132Данное руководство показывает, как Lazarus подключается к базе данных MySQL и выполняет простые запросы, используя основные компоненты Lazarus. Использования компонент отображения данных не будет, покажем только принцип взаимодействия с базами данных.
133133
134134Создайте новый проект в Lazarus:
135135
136136`Project -> New Project -> Application`
137137
138138Автоматически сгенерируется новая форма..
139139
140140Растяните форму на пол-экрана и переименуйте ее и ее заголовок в 'TryMySQL'.
141141
142142Расположите на форме сверху слева три компонента TEdit с вкладки Standard и над каждым из них поместите компонент TLabel. Задайте им заголовки 'Host' (и имена HostLLabel, HostEdit), 'UserName' (UserLabel, UserEdit) и 'Password' (PasswdLabel и PasswdEdit). Как вариант вы можете использовать компонент TLabelledEdit с закладки Additional.
143143
144144Найдите свойство PasswordChar у компонента PasswdEdit, измените его на * или любой другой символ, это приведет к тому, что когда вы вводите пароль, то вместо пароля будет отображаться именно этот символ (несколько символов). Убедитесь, что свойство Text у этого компонента не содержит текста.
145145
146146Теперь расположите еще один компонент Tedit и TLabel в правом верхнем углу формы. Измените заголовок на 'Enter SQL Command' и переименуйте компонент в CommandEdit.
147147
148148Поместите на форму три кнопки, две слева под компонентами TEdit и одну справа под компонентом для команд.
149149
150150Измените свойства Label (Name) левых кнопок на 'Connect to Database' (ConnectButton) и 'Exit' (ExitButton) и правой - 'Send Query' (QueryButton).
151151
152152Расположите большой TMemo с заголовком 'Results' (ResultMemo) слева внизу так, чтобы он заполнил все оставшееся место. Найдите свойство ScrollBars и установите значение ssAutoBoth, чтобы компонент мог прокручивать текст и вертикально и горизонтально. Свойство WordWrap установите в True.
153153
154154Поместите на форму статусную строку (TStatusBar с закладки Common Controls) внизу формы и впишите в свойство SimpleText строку 'TryMySQL'.
155155
156156[Вот что должно получится](http://lazarus-ccr.sourceforge.net/kbdata/trymysqldb.png)
157157
158158Теперь нам потребуется написать несколько обработчиков.
159159
160160У нас на форме слева три компонента TEdit для ввода имени хоста, пользователя и пароля. Как только в них будут введены необходимые данные, нужно нажать на кнопку Connect. Обработчик OnClick для этой кнопки частично базируется на модуле для FPC, который мы привели выше.
161161
162162Результаты запросов к базе данных не могут быть сразу выведены с помощью операторов Pascal write или writeln, сначала их необходимо преобразовать в строки и вывести в компонент TMemo.
163163
164164Хотя операторы Pascal write и writeln и приспособлены для преобразования типов «на лету», использование компонента TMemo для вывода текста требует прямого преобразования типов в строковую форму, так переменные типа Pchar должны быть преобразованы в строки путем использования StrPas, и числа должны конвертироваться функцией IntToStr.
165165
166166Добавим строки в TMemo используя
167167
168168`procedure ShowString (S : string);`\
169169`(* display a string in a Memo box *)`\
170170`begin`\
171171`      trymysqlForm1.ResultsMemo.Lines.Add (S)`\
172172`end;`
173173
174174Таким образом, обработчик ConnectButton становится следующим:
175175
176176`procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);`\
177177`(* Connect to MySQL using user data from Text entry boxes on Main Form *)`\
178178`var strg: string;`\
179-\
179+
180180`begin`\
181-\
181+
182182` dummy1 :=  trymysqlForm1.HostEdit.text+#0;`\
183183` host := @dummy1[1];`\
184184` dummy2 := trymysqlForm1.UserEdit.text+#0;`\
185185` user := @dummy2[1] ;`\
186186` dummy3 := trymysqlForm1.PasswdEdit.text+#0;`\
187187` passwd := @dummy3[1] ;`\
188188` alloc := mysql_init(PMYSQL(@qmysql));`\
189189` sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);`\
190190` if sock=Nil then`\
191191`   begin`\
192192`     strg :='Couldnt connect to MySQL.'; showstring (strg);`\
193193`     Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);`\
194194`  end`\
195195`   else`\
196196`   begin`\
197197`     trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';`\
198198`     strg := 'Now choosing database : ' + database; showstring (strg);`\
199199`{$ifdef Unix}`\
200200`     strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);`\
201201`     strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);`\
202202`{$endif}`\
203203`     Strg :='Host info       : ' + StrPas(mysql_get_host_info(sock));`\
204204`     showstring (strg);`\
205205`     Strg :='Server info     : ' + StrPas(mysql_stat(sock)); showstring (strg);`\
206206`     Strg :='Client info     : ' + Strpas(mysql_get_client_info);  showstring (strg);`\
207207` `\
208208`     trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';`\
209209` if mysql_select_db(sock,DataBase) < 0 then`\
210210` begin`\
211211`   strg :='Couldnt select database '+ Database; ShowString (strg);`\
212212`   Strg := mysql_error(sock); ShowString (strg);`\
213213` end`\
214214` end;`\
215215`end;`
216216
217217Поле для ввода справа позволяет вводить команды SQL без завершающей точки-с-запятой; как только вы удовлетворитесь синтаксисом - жмите кнопку SendQuery - запрос выполнится и результат будет отображен в компоненте ResultsMemo.
218218
219219Обработчик SendQuery опять же базируется на версии FPC, за исключением использования преобразования типов для последующего отображения строк.
220220
221221Разница между программой на FPC и этой программой в том, что в случае возникновения ошибки программа на Free Pascal завершит свою работу и сессия MySQL останется открытой, в то же время во второй программе контроль вернется в главную форму и можно повторить попытку. В конечном итоге приложение нормально завершает свою работу (закрывая при этом сессию MySQL) при нажатии кнопки Exit.
222222
223223Ниже приведен код обработчика кнопки SendQuery:
224224
225225`procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);`\
226226`var`\
227227` dumquery, strg: string;`\
228228`begin`\
229229`    dumquery := TrymysqlForm1.CommandEdit.text;`\
230230`    dumquery := dumquery+#0;`\
231231`    query := @dumquery[1];`\
232232`    trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';`\
233233`    strg := 'Executing query : ' + dumQuery; showstring (strg);`\
234234`    if (mysql_query(sock,Query) < 0) then`\
235235`    begin`\
236236`      Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);`\
237237`    end`\
238238`    else`\
239239`    begin`\
240240`      recbuf := mysql_store_result(sock);`\
241241`      if RecBuf=Nil then`\
242242`      begin`\
243243`        Strg :='Query returned nil result.'; showstring (strg);`\
244244`      end`\
245245`      else`\
246246`      begin`\
247247`        strg :='Number of records returned  : ' + IntToStr(mysql_num_rows (recbuf));`\
248248`        Showstring (strg);`\
249249`        Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));`\
250250`        showstring (strg);`\
251251`        rowbuf := mysql_fetch_row(recbuf);`\
252252`        while (rowbuf <>nil) do`\
253253`        begin`\
254254`             Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +`\
255255`              rowbuf[2] +')';`\
256256`             showstring (strg);`\
257257`             rowbuf := mysql_fetch_row(recbuf);`\
258258`        end;`\
259259`      end;`\
260260`    end;`\
261261`end;`
262262
263263Сохраните свой проект и жмите Запуск -\> Запуск
264264
265265Полный листинг программы доступен [тут](http://lazarus-ccr.sourceforge.net/kbdata/mysqldemo.tar.gz)
266266
267267## Lazarus и PostgreSQL
268268
269269Очень краткое руководство по подключению Lazarus 0.9.12 (или более поздней версии) к базе данных PostgreSQL, локально или удаленно, используя компонент TPQConnection.
270270
271271- После корректной установки, выполните следующие шаги:
272272 - Поместите на форму компоненты PQConnection, SQLQuery, SQLTransaction с вкладки SQLdb
273273 - Поместите компонент DataSource с вкладки DataAccess
274274 - Поместите DBGrid с вкладки DataControls
275275
276276- В компоненте PQConnection заполните свойства:
277277 - transaction – ссылкой на объект SQLTransaction
278278 - DatabaseName
279279 - HostName
280280 - UserName + password
281281
282282Проверьте, что SQLTransaction автоматически привязался к PQConnection
283283
284284- В компоненте SQLQuery заполните свойства:
285285 - transaction соответствующим объектом
286286 - database
287287 - SQL (что-то вроде 'select * from anytable')
288288
289289В компоненте DataSource установите свойство DataSet который должен указываить на объект SQLQuery В компоненте DBGrid установите в свойстве datasource указатель на объект DataSource Включайте и активируйте все. DBGrid должен показать данные прямо во время разработки. TDBText и TDBEdit работают, но у меня только отображают данные. Для внесения изменений в базу данных я вызываю запрос вставки для базы напрямую, используя следующий код:
290290
291291`try`\
292292`  sql:= 'UPDATE table SET setting=1';`\
293293`  PQDataBase.Connected:=True;`\
294294`  PQDataBase.ExecuteDirect('Begin Work;');`\
295295`  PQDataBase.ExecuteDirect(sql);`\
296296`  PQDataBase.ExecuteDirect('Commit Work;');`\
297297`  PQDataBase.Connected:=False;`\
298298`except`\
299299`  on E : EDatabaseError do`\
300300`    MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
301301`  on E : Exception do`\
302302`    MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);`\
303303`end;`
304304
305305Примечания: Проверено в Windows, Lazarus 0.9.12 + PgSQL 8.3.1 Некоторые тесты в linux, Lazarus 0.9.12 и PgSQL 8.0.x
306306
307307Установка и ошибки: В тестируемой версии 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.
308308
309309## Lazarus и SQLite
310310
311311Luiz Américo
312312
313313Посетите страничку [sqlite4fpc](http://sqlite4fpc.yolasite.com/), чтобы найти описание API и дополнительную документацию.
314314
315315TSqliteDataset и TSqlite3Dataset сейчас входят в стандартную поставку Lazarus.
316316
317317### Введение
318318
319319TSqliteDataset и TSqlite3Dataset являются потомками TDataset, предоставляющими доступ к базам данных SQLite версий 2.8.x и 3.x.x соответственно. Ниже перечислены основные достоинства и недостатки:
320320
321321Достоинства:
322322
323323- Гибкость: программист может выбирать - использовать или нет язык SQL, что позволяет ему работать с простым макетом таблицы или с комплексным макетом любой сложности, насколько это позволяет SQL/sqlite
324324- Автоматическое обновление данных: нет необходимости обновлять данные вручную, используюя команды SQL - один метод берет на себя все заботы
325325- Скорость: данные кэшируются в оперативной памяти, что позволяет быстрее просматривать данные
326326- Не требуется установка/настройка сервера: просто поставляйте программу вместе с библиотекой sqlite
327327
328328Недостатки:
329329
330330- Требуется дополнительный файл (библиотека sqlite).
331331
332332### Требования
333333
334334- Для баз данных sqlite2:
335335 - fpc 2.0.0 или выше
336336 - Lazarus 0.9.10 или выше
337337 - runtime-библиотека sqlite 2.8.15 или выше (можно взять с [www.sqlite.org](http://www.sqlite.org))
338338
339339- Для баз данных sqlite3:
340340 - fpc 2.0.2 или выше
341341 - Lazarus 0.9.11 (svn revision 8443 или выше)
342342 - runtime-библиотека sqlite 3.2.1 или выше (можно взять с [www.sqlite.org](http://www.sqlite.org))
343343
344344Прежде чем начать проект lazarus, убедитесь что:
345345
346346- библиотека sqlite доступна по пути PATH или находится в каталоге программы
347347- под Linux, используйте cmem первым модулем в предложении uses главной программы (модуля проекта)
348348 - В Debian, Ubuntu и других Debian-like дистрибутивах (также относится к OpenSuse), в целях сборки Lazarus IDE вы должны установить пакеты libsqlite-dev/libsqlite3-dev, не только sqlite/sqlite3.
349349
350350### Как работать (Основы)
351351
352352Установите пакет из каталога /components/sqlite (смотрите инструкцию) (Пакет → Настройка установленных пакетов → установить sqlite3laz)
353353
354354Во время разработки установите следующие свойства:
355355
356356- FileName: путь к файлу базы данных \[обязательно\]
357357- TableName: название таблицы используемой в sql выражении \[обязательно\]
358358- Sql: SQL select выражение \[необязательно\]
359359
360360**Создание таблицы (Dataset)**
361361
362362Сделайте двойной щелчок мышкой по иконке компонента или используйте пункт 'Create Table' в выпадающем меню, которое появляется после щелчка правой кнопкой мыши по компоненту. Перед Вами появится окно редактора таблицы.
363363
364364Ниже даны все типы данных поддерживаемые TSqliteDataset и TSqlite3Dataset:
365365
366366- Integer
367367- AutoInc
368368- String
369369- Memo
370370- Bool
371371- Float
372372- Word
373373- DateTime
374374- Date
375375- Time
376376- LargeInt
377377- Currency
378378
379379**Получение данных**
380380
381381После создания таблицы, откройте базу данных методом Open. Если свойство SQL не установлено, то будут выбраны все записи из всех полей, что эквивалентно следующему SQL выражению:
382382
383383`SQL:='Select * from TABLENAME'; `
384384
385385**Закрепление изменений в файле базы данных**
386386
387387Используйте метод ApplyUpdates. При этом dataset должно содержать минимум одно поле которое требуется для Первичного Ключа (значения поля должны быть UNIQUE и не NULL) Это возможно достичь двумя путями:
388388
389389- Установите свойство PrimaryKey, дав ему имя поля, которое будет Первичным Ключом
390390- Добавьте поле типа AutoInc (Это поле часто используется в TSqliteDataSet автоматически как Первичный Ключ)
391391
392392Если одно из двух действий выполнено, вызывайте
393393
394394`ApplyUpdates;`
395395
396396PS1: Если выполнены оба действия, то для ApplyUpdates используется поле установленное в свойстве PrimaryKey.
397397
398398PS2: Установка поля в PrimaryKey которое не является Первичным Ключём может привести к повреждению данных при вызове ApplyUpdates. Так же убедитесь, что используемое поле содержит уникальные и не Null значения перед тем как использовать это.
399399
400400### Примечания
401401
402402- Хотя это было проверено с таблицей в 10000 записей и работало прекрасное, однако TSqliteDataset хранит все данные в памяти, так что не забудьте извлекать только необходимые данные (это в первую очередь касается Memo Полей)
403403- Один и тот же файл данных (свойство Filename) может содержать несколько таблиц/наборов данных
404404- Несколько наборов данных (различные комбинации полей) могут быть созданы, используя одну и ту же таблицу одновременно
405405- Возможно фильтровать данные используя оператор WHERE в sql выражении, закрывая и вновь открывая набор данных (или вызывая метод RefetchData). Но в этом случае расположение и число полей должны оставаться одинаковыми
406406- Также возможно применение сложных операторов SQL, используя псевдонимы, объединения, представления из нескольких таблиц (помните, что они должны постоянно находится в том же файле данных), но в этом случае ApplyUpdates не будет работать. Если кто-то хочет использовать сложные запросы и применить обновления файла данных, сообщите мне по почте и я дам некоторые советы, как это сделать
407407- Устанавить имя файла при несозданном sqlite2.x файле данных и если после открыть TSqliteDataset, то это возможно, но у некоторых полей не будут обнаружены правильный тип поля. Они будут обработаны как строковые поля.
408408
409409Примеры для sqlite можно найти в каталоге fpc/fcl/db/sqlite
410410
411411Luiz Américo pascalive(at)bol(dot)com(dot)br
412412
413413## Lazarus и MSSQL
414414
415415На сегодняшний день с MSSQL можно работь через:
416416
417417- встроенный драйвер SQLDB (последний Lazarus/FPC 2.6.1+ из исходников, недоступен как stable download): TMSSQLConnection (MS SQL) и TSybaseConnection (Sybase ASE)
418418- Zeos (свежий CVS, см. ссылки на Zeos на данной странице)
419419- ODBC (MS SQL и Sybase ASE)
420420
421421Пожалуйста, обратитесь к справке FPC и Lazarus, чтобы подробнее узнать про SQLDB для Sybase ASE и MS SQL Server.
422422
423423## Lazarus и Firebird / Interbase
424424
425425Посмотрите [Установка пакетов](http://wiki.lazarus.freepascal.org/Install_Packages). На этой странице расположен небольшой пример для начинающих, как соединиться с сервером FireBird или InterBase.
426426
427427### FBLib Firebird Library
428428
429429[FBLib](http://fblib.altervista.org/) - это OpenSource библитотека для непосредственного доступа к серверу из Borland Delphi / Kylix, Freepascal и Lazarus.
430430
431431Текущая реализация включает:
432432
433433- Непосредственный доступ к Firebird 1.0.x, 1.5.x и 2.0 Classic или SuperServer
434434- Кроссплатформенность \[Win32,Gnu/Linux,FreeBSD)
435435- Автоматический выбор клиентской библиотеки 'fbclient' или 'gds32'
436436- Запросы с параметрами
437437- Поддержка SQL диалектов 1 и 3
438438- LGPL лицензия
439439- Получение метаданных
440440- Простой синтаксический анализатор скриптов
441441- Добавляется только 100-150 KБ к экзешнику
442442- Поддержка BLOB-полей
443443- Выгрузка данных в HTML, SQL-скрипт
444444- Сервисные функции (backup,restore,gfix...)
445445- Обработчик событий
446446
447447Вы можете загрузить документацию с сайта [FBLib's website](http://fblib.altervista.org/).
448448
449449## Lazarus и dBase
450450
451451Tony Maro
452452
453453Вы можете также посетить [[Lazarus Tdbf Tutorial/ru|TDbf Страница руководства]].
454454
455455FPC содержит простой компонент базы данных под названием "TDbf", который функционально подобен компоненту TTable в Delphi ([вебсайт TDbf](http://tdbf.sourceforge.net/)), поддерживающий все основные функции по работе с файлами dBase. Этот компонент не устанавливается по умолчанию, поэтому Вы должны сами установить пакет из каталога "lazarus/components/tdbf" и пересобрать Lazarus. Он появится рядом с компонентом TDatasource на вкладке "Data Access".
456456
457457Компонент TDbf имеет преимущество перед другими компонентами баз данных, т.к. не требует никаких внешних библиотек, однако это не самая лучшая идея для больших приложений баз данных.
458458
459459Компонент очень удобен в применении. Просто поместите TDbf на свою форму, установите путь к каталогу, в котором будут Ваши файлы базы данных, задайте название таблицы, и свяжите его с Вашим компонентом TDatasource.
460460
461461Реальная программа требует немного большего усилия, как бы то ни было. Если таблица ещё не существует, то Вы должны будете её создать программно до открытия. **Примечание**: Версия OpenOffice 2.0x и выше содержит OpenOffice Base, которое может создать dbf файлы более дружественным способом.
462462
463463Попытка открыть несуществующую таблицу вызовет ошибку. Таблицы могут быть созданы программно через компонент после того, как во время выполнения будут заданы путь и название таблицы.
464464
465465Например, чтобы создать таблицу с названием "dvds", чтобы сохранить Вашу dvd коллекцию, Вы поместите компонент на свою форму, установите во время выполнения путь к каталогу с базой и установите название таблицы в "dvds". Получающийся файл будет назван "dvds.dbf". В свой код вставьте такие строки:
466466
467467``` pascal
468468 Dbf1.FilePathFull := '/path/to/my/database';
469469 Dbf1.TableName := 'dvds';
470470 With Dbf1.FieldDefs do begin
471471 Add('Name', ftString, 80, True);
472472 Add('Description', ftMemo, 0, False);
473473 Add('Rating', ftString, 5, False);
474474 end;
475475 Dbf1.CreateTable;
476476```
477477
478478Когда этот код будет выполнен, cоздасться таблица коллекции DVD. После этого данные можно будет отображать в компонентах просмотра данных, связав их через TDatasource с этим компонентом.
479479
480480Добавление индексов является немного отличным от типичного TTable. Это должно быть сделано после того, как база данных открыта. Этот же метод используется и для того, чтобы перестроить индексы. Например:
481481
482482``` pascal
483483 Dbf1.Exclusive := True;
484484 Dbf1.Open;
485485 Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
486486 Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
487487 Dbf1.Close;
488488```
489489
490490Первичный индекс будет файлом с названием "dvdsname.mdx", а второй будет файл с названием "rating.ndx". Однако в базе данных с множеством таблиц, Вы должны позаботиться об уникальности имени файлов индексов.
491491
492492**Примечание**. Для версий dBase, которые поддерживают несколько индексов в одном файле, расширение в имени индекса указывать не надо, только имя индекса. Тогда все индексы будут созданы в одном файле с названием таким же, как и имя таблицы, но с расширением ".mdx".
493493
494494Для того, чтобы указать конкретную версию таблицы, нужно задать свойство TDbf.TableLevel.
495495
496496### Поиск и отображение набора данных
497497
498498Simon Batty
499499
500500В этом примере я хочу найти в базе данных книг все названия, у которых есть автор и затем отобразить список в мемобоксе:
501501
502502``` pascal
503503Dbf1.FilePathFull := '/home/somelocatio/database_location/'; // путь к базе данных
504504 Dbf1.TableName := 'books.dbase'; // файл таблицы, включая расширение
505505 DbF1.Open;
506506 memo1.Clear; // очистка мемобокса
507507
508508 Dbf1.FilterOptions := [foCaseInsensitive];
509509 Df1.Filter := 'AU=' + QuotedStr('anauthor'); // AU это поле, где содержится имя автора
510510
511511 Dbf1.Filtered := true; // Включаем фильтрование
512512 Dbf1.First; // Переходим в начало отфильтрованных данных
513513 while not dbf1.EOF do // В цикле проходим весь полученый набор данных
514514 begin
515515 memo1.Append(Dbf1.FieldByName('TI').AsString); //TI это поле названий
516516 dbf1.next; // Переход на следующую запись
517517 end;
518518
519519Dbf1.Close;
520520```
521521
522522Заметьте, что Вы можете использовать Ddf1.findfirst, чтобы перейти на первую запись в отфильтрованном наборе, затем используйте Dbf1.next, чтобы перемещаться по данным. Я нашел, что использование Dbf1.Findnext подвешивает программуь.
523523
524524## Ссылки, связанные с этой статьей
525525
526526- [[Databases|Создание приложений для баз данных с помощью Lazarus используя модуль DB]]\
527527- [[MySQLDatabases|Создание приложений для баз данных MySQL]]\
528528- [[Zeos tutorial|Создание приложений баз данных с использованием компонентов Zeos]]
529529- [Pascal Data Objects](http://pdo.sourceforge.net) API для доступа к базам данных программами FPC и Delphi, и использующие родную библиотеку MySQL версий 4.1 и 5.0, и Firebird SQL 1.5 и 2.0. Сделано на подобие класса PDO в PHP.
530530
531531## Ответственность и изменения
532532
533533Эта страница сформирована из epikwiki [version](http://lazarus-ccr.sourceforge.net/index.php?wiki=LazarusDatabase).
534534
535535---
536536*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