Соединиться с SQLite?

Модератор: Модераторы

Соединиться с SQLite?

Сообщение McLion » 25.11.2015 18:00:03

Хочу реализовать подсоединение к 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;
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Re: Соединиться с SQLite?

Сообщение vitaly_l » 25.11.2015 19:07:44

McLion писал(а):Как сделать, чтобы фаил БД не создавался автоматически?

проверьте наличие файла: до, точнее вместо - того чтобы проверять соединение. И только при наличии файла проверяйте соединение.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Соединиться с SQLite?

Сообщение McLion » 25.11.2015 19:13:48

Хотел это избежать, но... придется значить.
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Re: Соединиться с SQLite?

Сообщение Лекс Айрин » 25.11.2015 19:17:42

vitaly_l, не всегда это возможно. А с базами данных может быть такая веселая штука, как доступ по сети... который может отсутствовать.

McLion, возможно, стоит посмотреть настройкиSQLite.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Соединиться с SQLite?

Сообщение McLion » 25.11.2015 19:21:39

Лекс Айрин писал(а):vitaly_l, не всегда это возможно. А с базами данных может быть такая веселая штука, как доступ по сети... который может отсутствовать


У меня все локально!
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00

Re: Соединиться с SQLite?

Сообщение Лекс Айрин » 25.11.2015 19:30:41

McLion, а для пользователей? Или это чисто локальный проект не лезущий в сеть?

Если так, то стоит действительно проверять файл на существование. Но и настройки базы данных проверь. Возможно, там стоит автосоздание базы в случае ее отсутствия.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Соединиться с SQLite?

Сообщение vitaly_l » 25.11.2015 20:46:30

Лекс Айрин писал(а):не всегда это возможно. А с базами данных может быть такая веселая штука, как доступ по сети... который может отсутствовать

Он код привёл, там вот чего в коде есть:
Код: Выделить всё
SQLite3Connection1.DatabaseName := ExtractFilePath(Application.ExeName) + 'Database.db';

Лекс Айрин писал(а):Возможно, там стоит автосоздание базы в случае ее отсутствия.

она(база) всегда создаётся автоматом и она(база) - правильно делает. Потому что нефига, в неё отсутствующие файлы запрашивать.
Или ей(базе), если файла нет - нужно падать и устраивать пользователю бсоду, а система должна клеить ласты ?
В смысле дальше по коду посмотрите, что будет если ей(базе) не дать файл...


.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Соединиться с SQLite?

Сообщение Лекс Айрин » 25.11.2015 21:00:45

vitaly_l писал(а):Потому что нефига, в неё отсутствующие файлы запрашивать.
Или ей(базе), если файла нет - нужно падать и устраивать пользователю бсоду, а система должна клеить ласты ?

С чего это правильно написанная БД должна ласты клеить из-за попытки открытия файла? Это стандартный вариант развития событий.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Соединиться с SQLite?

Сообщение xterro » 25.11.2015 21:08:30

Маленький пример работы с 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.
xterro
постоялец
 
Сообщения: 148
Зарегистрирован: 23.02.2014 13:49:33

Re: Соединиться с SQLite?

Сообщение DYUMON » 25.11.2015 21:21:54

я конечно не силен в lazarus, но порылся в коде TSQLite3Connection, там используется функция sqlite_open(), которая открывает или когда нет базы то создает её.
Аватара пользователя
DYUMON
постоялец
 
Сообщения: 234
Зарегистрирован: 11.03.2009 13:32:54

Re: Соединиться с SQLite?

Сообщение McLion » 25.11.2015 22:21:41

А в целом мой код так ничё? Что все в try-except взял, не страшно?
Аватара пользователя
McLion
постоялец
 
Сообщения: 332
Зарегистрирован: 06.02.2015 18:41:00


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru