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

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

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

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

Сообщение krab » 23.02.2010 01:48:49

Добавляю таблицу в базу данных SQLite3:
Код: Выделить всё
sqlquery1.SQL.Add('create table Table1 (tid integer primary key autoincrement, info text)');
sqlquery1.ExecSQL;       

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

Подскажите пожалуйста, что исправить.
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

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

Сообщение Climber » 23.02.2010 02:27:40

Может, к коду это добавить?
Код: Выделить всё
sqlquery1.SQL.Text:='commit';
sqlquery1.ExecSQL; 
Climber
постоялец
 
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

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

Сообщение Lemboy » 23.02.2010 10:55:39

Хотелось бы добавить не совсем в качестве ответа, но по теме (сам недавно перешел на Lazarus, спешу поделиться свежим опытом :) )
По-моему, вообще удобнее использовать для создания таблиц SQLScript - можно все выражения по созданию базы в одном месте держать и в конце один Commit.
И еще есть удобный параметр для create table - "if not exists" - и ошибки "таблица уже существует" не будет.
Lemboy
незнакомец
 
Сообщения: 8
Зарегистрирован: 14.02.2010 01:46:13
Откуда: Крым

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

Сообщение Padre_Mortius » 23.02.2010 12:03:04

Пример по созданию таблиц в 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;
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение krab » 24.02.2010 15:00:46

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

Не компилируется.
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

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

Сообщение Padre_Mortius » 24.02.2010 22:53:30

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';
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

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

Сообщение tria » 25.02.2010 16:35:02

Не хочу казаться наивным, но после
sqlquery1.ExecSQL;
выполняете:
sqlquery1.Commit();
?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru