Страница 1 из 1
Соединиться с SQLite?
Добавлено: 25.11.2015 17:00:03
McLion
Хочу реализовать подсоединение к SQLite DB но есть проблемы. Делаю вот это, но проблема в том, что если даже БД не существует Lazarus ее создает и поэтому программа всегда выдает сообщение "соединил". Как сделать, чтобы фаил БД не создавался автоматически?
Код: Выделить всё
procedure TMainForm.FormCreate(Sender: TObject);
begin
try
SQLite3Connection1.DatabaseName := ExtractFilePath(Application.ExeName) + 'Database.db';
SQLite3Connection1.Transaction := SQLTransaction1;
SQLite3Connection1.Params.Add('foreign_keys=on;');
SQLTransaction1.DataBase := SQLite3Connection1;
SQLQuery1.DataBase := SQLite3Connection1;
SQLQuery1.Transaction := SQLTransaction1;
SQLite3Connection1.Open;
if SQLite3Connection1.Connected then
StatusBar1.Panels[0].Text := 'Соединил'
else StatusBar1.Panels[0].Text := 'Не соединил'
except
on E: Exception do MessageDlg('Ошибка при соединение с БД!'
+ sLineBreak + sLineBreak + E.ClassName + sLineBreak + E.Message, mtError, [mbOk], 0);
end;
end;
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 18:07:44
vitaly_l
McLion писал(а):Как сделать, чтобы фаил БД не создавался автоматически?
проверьте наличие файла: до, точнее вместо - того чтобы проверять соединение. И только при наличии файла проверяйте соединение.
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 18:13:48
McLion
Хотел это избежать, но... придется значить.
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 18:17:42
Лекс Айрин
vitaly_l, не всегда это возможно. А с базами данных может быть такая веселая штука, как доступ по сети... который может отсутствовать.
McLion, возможно, стоит посмотреть настройкиSQLite.
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 18:21:39
McLion
Лекс Айрин писал(а):vitaly_l, не всегда это возможно. А с базами данных может быть такая веселая штука, как доступ по сети... который может отсутствовать
У меня все локально!
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 18:30:41
Лекс Айрин
McLion, а для пользователей? Или это чисто локальный проект не лезущий в сеть?
Если так, то стоит действительно проверять файл на существование. Но и настройки базы данных проверь. Возможно, там стоит автосоздание базы в случае ее отсутствия.
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 19:46:30
vitaly_l
Лекс Айрин писал(а):не всегда это возможно. А с базами данных может быть такая веселая штука, как доступ по сети... который может отсутствовать
Он код привёл, там вот чего в коде есть:
Код: Выделить всё
SQLite3Connection1.DatabaseName := ExtractFilePath(Application.ExeName) + 'Database.db';
Лекс Айрин писал(а):Возможно, там стоит автосоздание базы в случае ее отсутствия.
она(база) всегда создаётся автоматом и она(база) - правильно делает. Потому что нефига, в неё отсутствующие файлы запрашивать.
Или ей(базе), если файла нет - нужно падать и устраивать пользователю бсоду, а система должна клеить ласты ?
В смысле дальше по коду посмотрите, что будет если ей(базе) не дать файл...
.
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 20:00:45
Лекс Айрин
vitaly_l писал(а):Потому что нефига, в неё отсутствующие файлы запрашивать.
Или ей(базе), если файла нет - нужно падать и устраивать пользователю бсоду, а система должна клеить ласты ?
С чего это
правильно написанная БД должна ласты клеить из-за попытки открытия файла? Это стандартный вариант развития событий.
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 20:08:30
xterro
Маленький пример работы с sqlite. Если файла БД нет, то создаём его и заполняем, если уже есть, просто делаем выборку
Код: Выделить всё
{$mode objfpc} {$h+}
program trdb;
uses sysutils, sqldb, db, sqlite3conn;
var
ds : tdatasource;
connection : TSQLite3Connection;
query : tsqlquery;
transaction : tsqltransaction;
dbname : string;
path : string;
begin
connection := TSQLite3Connection.create(nil);
transaction := tsqltransaction.create(nil);
query := tsqlquery.create(nil);
dbname := 'test.db';
path := getUserDir() + '.tr_storage/';
connection.databaseName := {path + dbname;} '/home/kirill/Workspace/trdb/test.db';
transaction.database := connection;
query.database := connection;
query.transaction := transaction;
if not FileExists(connection.databaseName) then
begin
writeln ('creating database...');
{
if not directoryExists(path) then
createDir(path);
}
connection.open;
transaction.active := true;
connection.executeDirect('CREATE TABLE "DATA"('+
' "id" Integer NOT NULL PRIMARY KEY AUTOINCREMENT,'+
' "Current_Time" DateTime NOT NULL,'+
' "User_Name" Char(128) NOT NULL,'+
' "Info" Char(128) NOT NULL);');
{ datetime format: yyyy-mm-dd hh:mm:ss.xxxxxx }
connection.executeDirect('insert into data values(1, "2007-01-01 10:00:00", "aaa", "some info for aaa")');
connection.executeDirect('insert into data values(2, "2008-01-01 10:00:00", "bbb", "some info for bbb")');
connection.executeDirect('insert into data values(3, "2009-01-01 10:00:00", "ccc", "some info for ccc")');
connection.executeDirect('insert into data values(4, "2010-01-01 10:00:00", "ddd", "some info for ddd")');
transaction.commit;
end;
{ select all }
writeln ('select from database...');
query.sql.text := 'select * from data';
query.open;
while not query.eof do
begin
writeln(query.fieldByName('id').AsInteger, ' ',
query.fieldByName('Current_Time').AsString, ' ',
query.fieldByName('User_Name').AsString, ' ',
query.fieldByName('Info').AsString);
query.next;
end;
query.close;
query.free;
connection.free;
end.
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 20:21:54
DYUMON
я конечно не силен в lazarus, но порылся в коде TSQLite3Connection, там используется функция sqlite_open(), которая открывает или когда нет базы то создает её.
Re: Соединиться с SQLite?
Добавлено: 25.11.2015 21:21:41
McLion
А в целом мой код так ничё? Что все в try-except взял, не страшно?