Теряются данные в базе данных после закрытия приложения

Вопросы программирования и использования среды Lazarus.

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

Ответить
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Теряются данные в базе данных после закрытия приложения

Сообщение krab »

Добавляю таблицу в базу данных SQLite3:

Код: Выделить всё

sqlquery1.SQL.Add('create table Table1 (tid integer primary key autoincrement, info text)');
sqlquery1.ExecSQL;       

Таблица создается, потому что если дважды выполнить этот код, возникает ошибка "таблица уже существует". Но когда после закрытия приложения смотрю базу через sqlite3.exe, команда .table говорит, что такой таблицы в бд нет.

Подскажите пожалуйста, что исправить.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Может, к коду это добавить?

Код: Выделить всё

sqlquery1.SQL.Text:='commit';
sqlquery1.ExecSQL; 
Lemboy
незнакомец
Сообщения: 8
Зарегистрирован: 14.02.2010 00:46:13
Откуда: Крым

Сообщение Lemboy »

Хотелось бы добавить не совсем в качестве ответа, но по теме (сам недавно перешел на Lazarus, спешу поделиться свежим опытом :) )
По-моему, вообще удобнее использовать для создания таблиц SQLScript - можно все выражения по созданию базы в одном месте держать и в конце один Commit.
И еще есть удобный параметр для create table - "if not exists" - и ошибки "таблица уже существует" не будет.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Пример по созданию таблиц в sqlite. Кусок из рабочего проекта

Код: Выделить всё

uses ...sqlite3;

function MyCallback(_para1: pointer; plArgc: longint; argv: PPchar;
  argcol: PPchar): longint; cdecl;
var
  i: integer;
  PVal, PName: ^PChar;
begin
  PVal  := argv;
  PName := argcol;
  for i := 0 to plArgc - 1 do
  begin
    Inc(PVal);
    Inc(PName);
  end;
  Result := 0;
end;

procedure Create_tbl_UserStatusList(sqlite : Psqlite3; aSQL, ErrMsg: AnsiString);
var
  rc     : integer;
begin
  aSql := 'BEGIN TRANSACTION; ';
  aSql := aSql + 'CREATE TABLE tbl_UserStatusList ('
        + 'StatusID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, '
        + 'StatusName VARCHAR(20) NOT NULL UNIQUE);';
  aSql := aSql + 'COMMIT TRANSACTION;';
  rc := sqlite3_exec(sqlite, PChar(ASql), @MyCallback, nil, @ErrMsg);
  if rc <> SQLITE_OK then
    MessageDlg(DBError, Format(CreateTblError, ['tbl_UserStatusList'])
              + #13#10 + ErrMsg, mtError, [mbOK], 0);

  aSql := 'BEGIN TRANSACTION;';
  aSQL := aSql + 'INSERT INTO tbl_UserStatusList VALUES (1, ''действует'');';
  aSql := aSql + 'INSERT INTO tbl_UserStatusList VALUES (2, ''заблокирован'');';
  aSql := aSql + 'COMMIT TRANSACTION;';
  rc := sqlite3_exec(sqlite, PChar(ASql), @MyCallback, nil, @ErrMsg);
  if rc <> SQLITE_OK then
    MessageDlg(DBError, Format(InsertError, ['tbl_UserStatusList'])
              + #13#10 + ErrMsg, mtError, [mbOK], 0);
end;

procedure CreateTableStructure;
var
  sqlite: Psqlite3;
  rc:     integer;
  aSQL, ErrMsg: AnsiString;
begin
  DBPath := GetDBPath; //путь к файлу БД
  aSQL := '';
  ErrMsg := '';
  if UTF8Length(DBPath) > 4 then
  begin
    rc := sqlite3_open(PChar(DBPath), @sqlite);
    if rc <> SQLITE_OK then
      MessageDlg(DBError, Format(OpenDbError, [DBPath]), mtError, [mbOK], 0);
    try
      Create_tbl_UserStatusList(sqlite, aSQL, ErrMsg);
    finally
      sqlite3_close(sqlite);
    end;
  end;
end;
krab
постоялец
Сообщения: 108
Зарегистрирован: 17.02.2010 17:23:08

Сообщение krab »

Padre_Mortius писал(а):Пример по созданию таблиц в sqlite. Кусок из рабочего проекта

Так даже лучше, без компонентов, но:
unit1.pas(30,21) Hint: Parameter "_para1" not used
unit1.pas(58,22) Error: Identifier not found "DBError"
unit1.pas(58,45) Error: Identifier not found "CreateTblError"
unit1.pas(68,23) Error: Identifier not found "DBError"
unit1.pas(68,43) Error: Identifier not found "InsertError"
unit1.pas(88,25) Error: Identifier not found "DBError"
unit1.pas(88,45) Error: Identifier not found "OpenDbError"
unit1.pas(102) Fatal: There were 6 errors compiling module, stopping

Не компилируется.
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

unit1.pas(58,22) Error: Identifier not found "DBError"
unit1.pas(58,45) Error: Identifier not found "CreateTblError"
unit1.pas(68,23) Error: Identifier not found "DBError"
unit1.pas(68,43) Error: Identifier not found "InsertError"
unit1.pas(88,25) Error: Identifier not found "DBError"
unit1.pas(88,45) Error: Identifier not found "OpenDbError"

Это обычные строки. Можете спокойно их удалить либо определить ваши значения. У меня они определены следующим образом

Код: Выделить всё

resourcestring
  DBERror     = '[Database Error]';
  OpenDbError = 'Can''t open database %s';
  InsertError = 'Can''t insert into table %s';
  CreateTblError = 'Can''t create table %s';
  DeleteTblError = 'Can''t delete from table %s';
 
tria
постоялец
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10
Контактная информация:

Сообщение tria »

Не хочу казаться наивным, но после
sqlquery1.ExecSQL;
выполняете:
sqlquery1.Commit();
?
Ответить