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