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
| Old | New | Line | |
|---|---|---|---|
| 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).* |
