Для реализации задач, нам необходима база данных. Желательно бесплатная и простая. И выбрал я SQLite.
Плюсы:
- Бесплатный и открытый исходный код
- Не нуждается в дополнительной настройке на клиентской машине, надо только одну DLL
- Очень быстрый
- Возможность работать в режиме только чтение и гостевого аккаунта
- Не записывает ни чего в реестр, и другие файлы
- Поддерживается стандартного SQL ( http://www.sqlite.org/lang.html )
Как я упомянул выше, для разработки и работы программы с базой данных нам нужна одна единственная sqlite3.dll. Она должна находиться в папке с программой, а так же в директории XE3 (RAD Studio\10.0\bin). Я еще добавил ее в Windows\system32.
Из компонентов Delphi нам понадобятся:
ActionList1(TActionList)
DBServer (TSQLConnection)
SQLQuery1(TSQLQuery)
Настройку компонентов можно сделать из дизайнера, а можно вручную.
Создадим процедуру инициализации соединения с БД через DBServer.
procedure InitialConnection(ASQLConnection: TSQLConnection; AFileName: string);
begin
ASQLConnection.ConnectionName := 'SQLITECONNECTION';
ASQLConnection.DriverName:='Sqlite';
ASQLConnection.LoginPrompt:= false;
ASQLConnection.Params.Values['Host']:='localhost';
ASQLConnection.Params.Values['FailIfMissing']:='False';
ASQLConnection.Params.Values['ColumnMetaDataSupported']:='False';
ASQLConnection.Params.Values['Database']:=AFileName;
ASQLConnection.Open;
end;
ASQLConnection.Open открывает базу, если файла нет, то создает. Если же в указанную папку нельзя записать, возникнет ошибка. Так как это не прямая функция, то обрабатывать ошибки будет вызывающая процедура (acDBServerExecute).
Для передачи SQL запросов используем SQLQuery1. Но перед использованием свяжем его с нашим соединением DBServer.
SQLQuery1.SQLConnection := DBServer;
Все, можно отправлять запросы. Так например нам надо создать таблицу в базе, если ее нет (первый раз открываем базу). Давно в исходниках INIFiles подсмотрел такой вид процедур, которые начинаются на
MayBeХххх(). Как я понимаю, это процедуры которые может быть что-то делают. Так вот я использую такую процедуру для создания таблицы в безе. если ее нет.
procedure MayBeCreateTables(AQuery: TSQLQuery);
begin
AQuery.SQL.Clear;
AQuery.SQL.Text :='CREATE TABLE if not exists MyBids ( '+
'id INTEGER NOT NULL PRIMARY KEY,'+
'WellNo CHAR(10),'+
'Field CHAR(20),'+
'WellZaboy CHAR(10),'+
'WellDiam CHAR(10),'+
'WellRastvor CHAR(20),'+
'DateDone DATE,'+
'TimeDone TIME,'+
'DateConfirm DATE,'+
'TimeConfirm TIME,'+
'Task TEXT,'+
'Zakazhik TEXT,'+
'Predstavitel TEXT,'+
'Partia TEXT,'+
'Comment TEXT,'+
'DateRecieve DATE,'+
'TimeRecieve TIME,'+
'Status TEXT,'+
'DateChange DATE,'+
'TimeChange TIME'+
');';
AQuery.ExecSQL;
end;
Ключевым словом здесь является
if not exists в SQL запросе. Таким образом SQLite сам проверяет есть ли такая таблица и если нет, то создает. Спасибо ему за это.
Осталось собрать все в кучу и обработать возможные ошибки.
В ActionList добавим новое действие в категорию DB и назовем его acDBServerStart. В нем мы будем запускать наш сервер БД.
procedure TForm1.acDBServerStartExecute(Sender: TObject);
begin
try
InitialConnection(DBServer, 'C:\DB\bids.db');
SQLQuery1.SQLConnection := DBServer;
MayBeCreateTables(SQLQuery1);
except
on E: Exception do
begin
ShowMessage( StringReplace(E.Message, #13, ' ', [rfReplaceAll]);
//raise;
end;
end;
end;
//raise - закоментировал, что бы не отображались ошибки. Их будем записывать в лог.
Таким образом мы настроили соединение, соединились и на случай отсутствия таблицы создали ее. Можно добавлять данные в таблицу.