Lazarus Database Tutorial/ru

From Lazarus wiki
Revision as of 04:46, 21 July 2009 by Vadim (talk | contribs) (FBLib Firebird Library)

Deutsch (de) English (en) español (es) français (fr) Bahasa Indonesia (id) italiano (it) 日本語 (ja) Nederlands (nl) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN) 中文(台灣)‎ (zh_TW)

Обзор

Это руководство по работе с различными базами данных в Lazarus. Lazarus поддерживает множество баз данных с помощью внешних пакетов, разработчик должен установить соответствующий пакет для каждой из них. Вы можете получить доступ к базе данных путем написания соответствующего кода или использую компоненты в форме. Компоненты доступа к данным представляют поля и подключаются путем установки свойства DataSource, которое представляет таблицу и подключается к компонентам баз данных, например TPSQLDatabase, TSQLiteDataSet путем установки свойства DataSet. Компоненты доступа к данным располагаются на вкладке "Data Controls". Источники данных и компоненты доступа к базам данных располагаются на вкладке "Data Access".

Lazarus и MySQL

Получение работающего MySQL в Linux или Windows

Следуйте инструкциям в Руководстве пользователя MySQL. Убедитесь в том, что демон mysqld работает надежно, и в том, что все потенциальные пользователи (в том числе root, mysql, вы сами и все остальные, кому это может понадобиться) имеют столько привилегий, сколько им нужно (настолько, насколько это согласуется с безопасностью). Желательно, чтобы все пользователи, включая root, имели пароли. Проверьте действия в системе базы данных, используя примеры, приведенные в руководстве, и убедитесь, что все пользователи действительно имеют надежный доступ.

Работа с MySQL в текстовом режиме

В каталоге $(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

CREATE DATABASE testdb;

Затем убедитесь, что все соответствующие пользователи имеют соответствующие права доступа к этой базе данных

GRANT ALL ON testdb TO johnny-user IDENTIFIED BY 'johnnyspassword'; 

Существует скрипт, называемый mkdb, попробуйте его запустить:

sh ./mkdb

Скорее всего, из этого ничего не выйдет, потому что система не позволит анонимному пользователю получить доступ к базе данных. Измените скрипт с помощью текстового редактора таким образом, чтобы строка запуска mysql выглядела так:

mysql -u root -p  ${1-testdb} << EOF >/dev/null

и запустите его еще раз, когда появится запрос – введите пароль. Возможно, вам удалось создать тестовую базу данных, проверьте ее, войдя в mysql монитор и введя следующую команду

select * from FPdev;

Вы увидите таблицу с ID, именами пользователя и email-адресами некоторых разработчиков FPC.

Теперь попробуйте запустить тестовую программу testdb.pp (возможно, придется ее скомпилировать и весьма вероятно, что с первой попытки это не удастся!!).

Я обнаружил, что программа не может соединиться с mysql по нескольким причинам:

  • Моя система (SuSE Linux v9.0) содержит mysql v4.0.15, а не версию 3, для которой был разработан пакет доступа к mysql.
  • Программе требуется имя пользователя и пароль для доступа к базе данных.
  • Компилятору хочется знать, где можно найти библиотеки mysql (ЕСЛИ ВЫ ДО СИХ ПОР НЕ УСТАНОВИЛИ БИБЛИОТЕКИ РАЗРАБОТЧИКА MYSQL, СДЕЛАЙТЕ ЭТО ПРЯМО СЕЙЧАС!)

Я создал копию testdb.pp с именем trydb.pp, не редактируя оригинал – это означает, что исходные файлы еще получат исправления в последующих обновлениях CVS. Также я скопировал файлы в каталоге mysql/ver40/ в основной каталог mysql/, переименовав их в mysql_v4.pp, mysql_com_v4.pp и mysql_version_v4.pp, будучи уверенным в переименовании каждого модуля соответственно. Я изменил uses в trydb.pp на

uses mysql_v4

и в mysql_v4.pp на

uses mysql_com_v4

Я добавил строку в /etc/fpc.cfg, показывающую на мои библиотеки:

-Fl/lib;/usr/lib

В следующем шаге, возможно, не будет необходимости, если библиотеки разработчика установлены в качестве ссылок, но проверить не помешает. Мне пришлось найти подлинное имя из библиотеки mysqlclint в /usr/lib каталоге, и в моем случае мне пришлось выдать команду:

ln -s libmysqlclient.so.12.0.0 lmysqlclient

чтобы создать символическую ссылку, позволяющую FPC найти библиотеку. Также я создал ссылку

ln -s libmysqlclient.so.12.0.0 mysqlclient

и поместил аналогичные ссылки в других каталогах: не то, чтобы очень уж необходимо, но на всякий случай. Некоторым пользователям, возможно, придется добавить следующую ссылку

ln -s libmysqlclient.so.12.0.0 libmysqlclient.so

Я изменил trydb.pp – включил реквизиты пользователя, стартовый хост, имя пользователя и пароль как константы:

const
 host : Pchar= 'localhost';
 user : Pchar= 'myusername';
 passwd: Pchar = 'mypassword';

Я также обнаружил, что не могу соединиться с mysql, используя вызов mysql_connect() и мне приходится использовать вызов функции mysql_real_connect(), которая имеет гораздо больше параметров. Дальнейшее осложняется тем, что количество параметров изменилась между версией 3 (их было семь) и версией 4 (стало восемь). Перед использованием mysql_real_connect мне пришлось использовать mysql_init(), который не нашелся в оригинале mysql.pp но имеется в mysql_v4.pp.

Ну вот и код для подключения к базе данных:

{ a few extra variables}
var
  alloc : PMYSQL;

{main program fragment}

begin
 if paramcount=1 then
 begin
   Dummy:=Paramstr(1)+#0;
   DataBase:=@Dummy[1];
 end;

 Writeln ('Allocating Space...');
 alloc := mysql_init(PMYSQL(@qmysql));
 Write ('Connecting to MySQL...');
 sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
 if sock=Nil then
 begin
   Writeln (stderr,'Couldnt connect to MySQL.');
   Writeln (stderr, 'Error was: ', mysql_error(@qmysql));
   halt(1);
 end;
 Writeln ('Done.');
 Writeln ('Connection data:');
{$ifdef Unix}
 writeln ('Mysql_port      : ',mysql_port);
 writeln ('Mysql_unix_port : ',mysql_unix_port);
{$endif}
 writeln ('Host info       : ',mysql_get_host_info(sock));
 writeln ('Server info     : ',mysql_stat(sock));
 writeln ('Client info     : ',mysql_get_client_info);

 Writeln ('Selecting Database ',DataBase,'...');
 if mysql_select_db(sock,DataBase) < 0 then
 begin
   Writeln (stderr,'Couldnt select database ',Database);
   Writeln (stderr,mysql_error(sock));
   halt (1);
 end;
 {... as original contents of testdb.pp}

Теперь готовы к компиляции trydb.pp?

fpc trydb

Успешно! Запускаем:

./trydb

У-у-у-е-е-е-е! Я попал в список разработчиков FPC! Несколько дополнительных уточнений: сделать ввод реквизитов пользователя и mysql команд интерактивным, с помощью переменных, а не констант, и позволить вводить SQL команды, пока не подадим команду выхода: см. полный листинг программы см. полный листинг программы, в которой реквизиты пользователя вводятся из консоли, и программа входит в цикл, где SQL команды вводятся в консоли (без закрывающей запятой), и результаты выводятся до тех пор, пока с клавиатуры не будет введена команда "quit". Листинг консольного вывода здесь

Подключение к MySQL из приложения Lazarus

Данное руководство показывает, как Lazarus подключается к базе данных MySQL и выполняет простые запросы, используя основные компоненты Lazarus. Использования компонент отображения данных не будет, покажем только принцип взаимодействия с базами данных.

Создайте новый проект в Lazarus:

Project -> New Project -> Application

Автоматически сгенерируется новая форма..

Растяните форму на пол-экрана и переименуйте ее и ее заголовок в 'TryMySQL'.

Расположите на форме сверху слева три компонента TEdit с вкладки Standard и над каждым из них поместите компонент TLabel. Задайте им заголовки 'Host' (и имена HostLLabel, HostEdit), 'UserName' (UserLabel, UserEdit) и 'Password' (PasswdLabel и PasswdEdit). Как вариант вы можете использовать компонент TLabelledEdit с закладки Additional.

Найдите свойство PasswordChar у компонента PasswdEdit, измените его на * или любой другой символ, это приведет к тому, что когда вы вводите пароль, то вместо пароля будет отображаться именно этот символ (несколько символов). Убедитесь, что свойство Text у этого компонента не содержит текста.

Теперь расположите еще один компонент Tedit и TLabel в правом верхнем углу формы. Измените заголовок на 'Enter SQL Command' и переименуйте компонент в CommandEdit.

Поместите на форму три кнопки, две слева под компонентами TEdit и одну справа под компонентом для команд.

Измените свойства Label (Name) левых кнопок на 'Connect to Database' (ConnectButton) и 'Exit' (ExitButton) и правой - 'Send Query' (QueryButton).

Расположите большой TMemo с заголовком 'Results' (ResultMemo) слева внизу так, чтобы он заполнил все оставшееся место. Найдите свойство ScrollBars и установите значение ssAutoBoth, чтобы компонент мог прокручивать текст и вертикально и горизонтально. Свойство WordWrap установите в True.

Поместите на форму статусную строку (TStatusBar с закладки Common Controls) внизу формы и впишите в свойство SimpleText строку 'TryMySQL'.

Вот что должно получится

Теперь нам потребуется написать несколько обработчиков.

У нас на форме слева три компонента TEdit для ввода имени хоста, пользователя и пароля. Как только в них будут введены необходимые данные, нужно нажать на кнопку Connect. Обработчик OnClick для этой кнопки частично базируется на модуле для FPC, который мы привели выше.

Результаты запросов к базе данных не могут быть сразу выведены с помощью операторов Pascal write или writeln, сначала их необходимо преобразовать в строки и вывести в компонент TMemo.

Хотя операторы Pascal write и writeln и приспособлены для преобразования типов «на лету», использование компонента TMemo для вывода текста требует прямого преобразования типов в строковую форму, так переменные типа Pchar должны быть преобразованы в строки путем использования StrPas, и числа должны конвертироваться функцией IntToStr.

Добавим строки в TMemo используя

procedure ShowString (S : string);
(* display a string in a Memo box *)
begin
      trymysqlForm1.ResultsMemo.Lines.Add (S)
end;

Таким образом, обработчик ConnectButton становится следующим:

procedure TtrymysqlForm1.ConnectButtonClick(Sender: TObject);
(* Connect to MySQL using user data from Text entry boxes on Main Form *)
var strg: string;

begin

 dummy1 :=  trymysqlForm1.HostEdit.text+#0;
 host := @dummy1[1];
 dummy2 := trymysqlForm1.UserEdit.text+#0;
 user := @dummy2[1] ;
 dummy3 := trymysqlForm1.PasswdEdit.text+#0;
 passwd := @dummy3[1] ;
 alloc := mysql_init(PMYSQL(@qmysql));
 sock :=  mysql_real_connect(alloc, host, user, passwd, database, 0, nil, 0);
 if sock=Nil then
   begin
     strg :='Couldnt connect to MySQL.'; showstring (strg);
     Strg :='Error was: '+ StrPas(mysql_error(@qmysql)); showstring (strg);
  end
   else
   begin
     trymysqlForm1.statusBar1.simpletext := 'Connected to MySQL';
     strg := 'Now choosing database : ' + database; showstring (strg);
{$ifdef Unix}
     strg :='Mysql_port      : '+ IntToStr(mysql_port); showstring (strg);
     strg :='Mysql_unix_port : ' + StrPas(mysql_unix_port); showstring (strg);
{$endif}
     Strg :='Host info       : ' + StrPas(mysql_get_host_info(sock));
     showstring (strg);
     Strg :='Server info     : ' + StrPas(mysql_stat(sock)); showstring (strg);
     Strg :='Client info     : ' + Strpas(mysql_get_client_info);  showstring (strg);
 
     trymysqlForm1.statusbar1.simpletext := 'Selecting Database ' + DataBase +'...';
 if mysql_select_db(sock,DataBase) < 0 then
 begin
   strg :='Couldnt select database '+ Database; ShowString (strg);
   Strg := mysql_error(sock); ShowString (strg);
 end
 end;
end;

Поле для ввода справа позволяет вводить команды SQL без завершающей точки-с-запятой; как только вы удовлетворитесь синтаксисом - жмите кнопку SendQuery - запрос выполнится и результат будет отображен в компоненте ResultsMemo.

Обработчик SendQuery опять же базируется на версии FPC, за исключением использования преобразования типов для последующего отображения строк.

Разница между программой на FPC и этой программой в том, что в случае возникновения ошибки программа на Free Pascal завершит свою работу и сессия MySQL останется открытой, в то же время во второй программе контроль вернется в главную форму и можно повторить попытку. В конечном итоге приложение нормально завершает свою работу (закрывая при этом сессию MySQL) при нажатии кнопки Exit.

Ниже приведен код обработчика кнопки SendQuery:

procedure TtrymysqlForm1.QueryButtonClick(Sender: TObject);
var
 dumquery, strg: string;
begin
    dumquery := TrymysqlForm1.CommandEdit.text;
    dumquery := dumquery+#0;
    query := @dumquery[1];
    trymysqlForm1.statusbar1.simpletext := 'Executing query : '+ dumQuery +'...';
    strg := 'Executing query : ' + dumQuery; showstring (strg);
    if (mysql_query(sock,Query) < 0) then
    begin
      Strg :='Query failed '+ StrPas(mysql_error(sock)); showstring (strg);
    end
    else
    begin
      recbuf := mysql_store_result(sock);
      if RecBuf=Nil then
      begin
        Strg :='Query returned nil result.'; showstring (strg);
      end
      else
      begin
        strg :='Number of records returned  : ' + IntToStr(mysql_num_rows (recbuf));
        Showstring (strg);
        Strg :='Number of fields per record : ' + IntToStr(mysql_num_fields(recbuf));
        showstring (strg);
        rowbuf := mysql_fetch_row(recbuf);
        while (rowbuf <>nil) do
        begin
             Strg :='(Id: '+ rowbuf[0]+', Name: ' + rowbuf[1]+ ', Email : ' +
              rowbuf[2] +')';
             showstring (strg);
             rowbuf := mysql_fetch_row(recbuf);
        end;
      end;
    end;
end;

Сохраните свой проект и жмите Запуск -> Запуск

Полный листинг программы доступен тут

Lazarus и PostgreSQL

Очень краткое руководство по подключению Lazarus 0.9.12 (или поздней версии) к базе данных PostgreSQL, локально или удаленно, используя компонент TPQConnection. После корректной установки, выполните следующие шаги: Поместите на форму компоненты PQConnection, SQLQuery, SQLTransaction с вкладки SQLdb Поместите компонент DataSource с вкладки DataAccess И DBGrid с вкладки DataControls В компоненте PQConnection заполните свойства: transaction – ссылкой на объект SQLTransaction DatabaseName HostName UserName + password Проверьте, что SQLTransaction автоматически привязался к PQConnection В компоненте SQLQuery заполните свойства: transaction соответствующим объектом database SQL (что-то вроде 'select * from anytable') В компоненте DataSource установите свойство DataSet указателем на объект SQLQuery В компоненте DBGrid установите свойство datasource указателем на объект DataSource Включайте и активируйте все, DBGrid должен показать данные прямо во время разработки. TDBText и TDBEdit работают, но у меня только отображают данные. Для внесения изменений в базу данных я вызываю движок базы напрямую, используя следующий код:

try
  sql:= 'UPDATE table SET setting=1';
  PQDataBase.Connected:=True;
  PQDataBase.ExecuteDirect('Begin Work;');
  PQDataBase.ExecuteDirect(sql);
  PQDataBase.ExecuteDirect('Commit Work;');
  PQDataBase.Connected:=False;
except
  on E : EDatabaseError do
    MemoLog.Append('DB ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
  on E : Exception do
    MemoLog.Append('ERROR:'+sql+chr(13)+chr(10)+E.ClassName+chr(13)+chr(10)+E.Message);
end;

Примечания: Проверено в Windows, Lazarus 0.9.12 + PgSQL 8.3.1 Некоторые тесты в linux, Lazarus 0.9.12 и PgSQL 8.0.x

Установка и ошибки: В тестируемой версии 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

Lazarus и SQLite

by Luiz Américo Посетите страничку sqlite4fpc, чтобы найти описание API и дополнительную документацию.

Введение

TSqliteDataset и TSqlite3Dataset являются потомками TDataset, предоставляющими доступ к базам данных SQLite версий 2.8.x и 3.x.x соответственно. Ниже перечислены основные достоинства и недостатки:

Достоинства:

  • Гибкость: программист может выбирать - использовать или нет язык SQL, что позволяет ему работать с простым макетом таблицы или с комплексным макетом любой сложности, насколько это позволяет SQL/sqlite
  • Автоматическое обновление данных: нет необходимости обновлять данные вручную, используюя команды SQL - один метод берет на себя все заботы
  • Скорость: данные кэшируются в оперативной памяти, что позволяет быстрее просматривать данные
  • Не требуется установка/настройка сервера: просто поставляйте программу вместе с библиотекой sqlite

Недостатки

  • Требуется дополнительный файл (библиотека sqlite)

Требования

  • Для баз данных sqlite2:
    • fpc 2.0.0
    • Lazarus 0.9.10
    • runtime-библиотека sqlite 2.8.15 или выше (можно взять с www.sqlite.org)
  • Для баз данных sqlite3:
    • fpc 2.0.2
    • Lazarus 0.9.11 (svn revision 8443 или выше)
    • runtime-библиотека sqlite 3.2.1 или выше (можно взять с www.sqlite.org)

Прежде чем начать проект lazarus, убедитесь что:

  • библиотека sqlite доступна по пути PATH или находится в каталоге программы
  • под Linux, используйте cmem первым модулем в предложении uses главной программы (модуля проекта)

Как работать (Основы)

Установите пакет из каталога /components/sqlite (смотрите инструкцию)

Во время разработки установите следующие свойства:

  • FileName: путь к файлу базы данных [обязательно]
  • TableName: название таблицы используемой в sql выражении [обязательно]
  • Sql: SQL select выражение [необязательно]

Создание таблицы (Dataset)

Сделайте двойной щелчок мышкой по иконке компонента или используйте пункт 'Create Table' в выпадающем меню, которое появляется после щелчка правой кнопкой мыши по компоненту. Перед Вами появится окно редактора таблицы.

Ниже даны все типы файлов поддерживаемые TSqliteDataset и TSqlite3Dataset: 

Integer
AutoInc
String
Memo
Bool 
Float
Word
DateTime
Date
Time
LargeInt
Currency

Получение данных

После создания таблицы, откройте базу данных методом Open. Если свойство SQL не установлено, то будут выбраны все записи из всех полей, что эквивалентно следующему SQL выражению:

SQL:='Select * from TABLENAME'; 

Закрепление изменений в файле базы данных

Используйте метод ApplyUpdates. При этом dataset должно содержать минимум одно поле которое требуется для Первичного Ключа (значения поля должны быть UNIQUE и не NULL) Это возможно достичь двумя путями:

  • Установите свойство PrimaryKey, дав ему имя поля, которое будет Первичным Ключом
  • Добавьте поле типа AutoInc (Это поле часто используется в TSqliteDataSet автоматически как Первичный Ключ)

Если одно из двух действий выполнено, вызывайте

ApplyUpdates;

PS1: Если выполнены оба действия, то для ApplyUpdates используется поле установленное в свойстве PrimaryKey.

PS2: Установка поля в PrimaryKey которое не является Первичным Ключём может привести к повреждению данных при вызове ApplyUpdates. Так же убедитесь, что используемое поле содержит уникальные и не Null значения перед тем как использовать это.

Примечания

  • Хотя это было проверено с таблицей в 10000 записей и работало прекрасное, однако TSqliteDataset хранит все данные в памяти, так что не забудьте извлекать только необходимые данные (это в первую очередь касается Memo Полей)
  • Один и тот же файл данных (свойство Filename) может содержать несколько таблиц/наборов данных
  • Несколько наборов данных (различные комбинации полей) могут быть созданы, используя одну и ту же таблицу одновременно
  • Возможно фильтровать данные используя оператор WHERE в sql выражении, закрывая и вновь открывая набор данных (или вызывая метод RefetchData). Но в этом случае расположение и число полей должны оставаться одинаковыми
  • Также возможно применение сложных операторов SQL, используя псевдонимы, объединения, представления из нескольких таблиц (помните, что они должны постоянно находится в том же файле данных), но в этом случае ApplyUpdates не будет работать. Если кто-то хочет использовать сложные запросы и применить обновления файла данных, сообщите мне по почте и я дам некоторые советы, как это сделать
  • Устанавить имя файла при несозданном sqlite2.x файле данных и если после открыть TSqliteDataset, то это возможно, но у некоторых полей не будут обнаружены правильный тип поля. Они будут обработаны как строковые поля.

Примеры для sqlite можно найти в каталоге fpc/fcl/db/sqlite

Luiz Américo pascalive(at)bol(dot)com(dot)br

Lazarus and MSSQL

It is working with Zeoslib (latest cvs), see the links on bottom of page.

Lazarus and Interbase / Firebird

See Install Packages. On this page is a first small example en explanation about how to connect to an IB or FB server. Also work with the latest Zeoslib (from cvs).

FBLib Firebird Library

FBLib is an open Source Library No Data Aware for direct access to Firebird Relational Database from Borland Delphi / Kylix, Freepascal and Lazarus.

Current Features include:

  • Direct Access to Firebird 1.0.x 1.5.x Classic or SuperServer
  • Multiplatform [Win32,Gnu/Linux,FreeBSD)
  • Automatic select client library 'fbclient' or 'gds32'
  • Query with params
  • Support SQL Dialect 1/3
  • LGPL License agreement
  • Extract Metadata
  • Simple Script Parser
  • Only 100-150 KB added into final EXE
  • Support BLOB Fields
  • Export Data to HTML SQL Script
  • Service manager (backup,restore,gfix...)
  • Events Alerter

You can download documentation on FBLib's website.

Lazarus and dBase

Tony Maro

You might also want to visit the beginnings of the TDbf Tutorial page

FPC includes a simple database component that is similar in function to the Delphi TTable component called "TDbf" (TDbf Website) that supports a very basic subset of features for dBase files. It is not installed by default, so you will first need to install the Lazarus package from the "lazarus/components/tdbf" directory and rebuild your Lazarus IDE. It will then appear next to the TDatasource in your component palette.

The TDbf component has an advantage over other database components in that it doesn't require any sort of runtime database engine, however it's not the best option for large database applications.

It's very easy to use. Simply, put, drop a TDbf on your form, set the runtime path to the directory that your database files will be in, set the table name, and link it to your TDatasource component.

Real functionality requires a bit more effort, however. If a table doesn't already exist, you'll need to create it programmatically, unless there's a compatible table designer I'm not familiar with. Note: Current version of OpenOffice (2.0x) contains OpenOffice Base, which can create dbf files in a somewhat user-friendly way.

Attempting to open a non-existant table will generate an error. Tables can be created programmatically through the component after the runtime path and table name are set.

For instance, to create a table called "dvds" to store your dvd collection you would drop it on your form, set the runtime path, and set the table name to "dvds". The resulting file will be called "dvds.dbf".

In your code, insert the following:

   Dbf1.FilePathFull := '/path/to/my/database';
   Dbf1.TableName := 'dvds';
   With Dbf1.FieldDefs do begin
       Add('Name', ftString, 80, True);
       Add('Description', ftMemo, 0, False);
       Add('Rating', ftString, 5, False);
   end;
   Dbf1.CreateTable;

When this code is run, your DVD collection table will be created. After that, all data aware components linked through the TDatasource to this component will allow easy access to the data.

Adding indexes is a little different from your typical TTable. It must be done after the database is open. It's also the same method you use to rebuild the indexes. For instance:

   Dbf1.Exclusive := True;
   Dbf1.Open;
   Dbf1.AddIndex('dvdsname','Name',[ixPrimary, ixUnique, ixCaseInsensitive]);
   Dbf1.AddIndex('rating.ndx', 'Rating', [ixCaseInsensitive]);
   Dbf1.Close;

The first (primary) index will be a file called "dvdsname.mdx" and the second will be a file named "rating.ndx" so in a multiple table database you must be careful not to use the same file name again.

I will try to add a more detailed example at a later date, but hopefully this will get those old Delphi programmers up and running with databases in Lazarus!


Searching and Displaying a data set.

Simon Batty

In this example I wanted to search a database of books for all the titles an author has listed and then display the list in a memo box


Dbf1.FilePathFull := '/home/somelocatio/database_location/'; // path to the database directory

 Dbf1.TableName := 'books.dbase';                     // database file (including extension)
 DbF1.Open;
 memo1.Clear;                                           // clear the memo box
  Dbf1.FilterOptions := [foCaseInsensitive];
  Df1.Filter := 'AU=' + QuotedStr('anauthor'); // AU is the field name containing the                                                           authors
   Dbf1.Filtered := true;   // This selects the filtered set
   Dbf1.First;                                   // moves the the first filtered data
 while not dbf1.EOF do                           //  prints the Titles that match the author                                                      to the memo box
    begin
      memo1.Append(Dbf1.FieldByName('TI').AsString); //TI is the field name for titles
      dbf1.next;                                // use .next here NOT .findnext!
    end;

Dbf1.Close;

Note that you can use Ddf1.findfirst to get the first record in the filtered set, then use Dbf1.next to move though the data. I found that using Dbf1.Findnext just causes the program to hang.

This database was generated using TurboBD that came with the Kylix 1. I cannot get TurboBD tables to work with Lazarus, however you can download a command line tool from TurboDB's website that allows you to convert TurboDB table to other formats.

Related Links

Contributors and Changes

This page has been converted from the epikwiki version.