sqlite3 и SIGSEGV

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

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

sqlite3 и SIGSEGV

Сообщение krab » 15.03.2010 14:56:10

Работаю с sqlite3. Мне нужно проверить, есть ли в таблице записи с id=4. Пытаюсь это сделать с помощью функций из модуля sqlite3. При вызове процедуры Run возникает SIGSEGV на строчке "rc := sqlite3_prepare(sqlite, PChar(aSql), -1, stmt, @ErrMsg);" в функции Test. Причем GetData отрабатывает прекрасно, то есть проблем с открытием БД нет.

Можете подсказать, в чем дело?

Использовать DataSet'ы и т. п. не буду, т. к. уже много написал с использованием функций из модуля sqlite3.
Код: Выделить всё
procedure Run;
var
   r : boolean;
begin
  OpenDb;
  r:=Test;
  CloseDb;
end;

procedure OpenDb;
var
  rc: integer;
begin
  if UTF8Length(DBPath) > 4 then
  begin
    rc := sqlite3_open(PChar(DBPath), @sqlite);
    if rc <> SQLITE_OK then
      ShowMessage('error');
  end;
end;

function Test : boolean;
var
  rc : integer;
  aSql, ErrMsg: ansistring;
  stmt : Psqlite3_stmt;
begin
  stmt := nil;
  aSql := 'SELECT * FROM MyTable WHERE id=4;';
  rc := sqlite3_prepare(sqlite, PChar(aSql), -1, stmt, @ErrMsg);
  if rc <> SQLITE_OK then
  begin
   ShowMessage('Error');
   exit;
  end;

  if (sqlite3_step(stmt)=SQLITE_ROW) then
  begin
       ShowMessage('Yes');
  end
  else
     ShowMessage('No');
end;

procedure GetData;
var
  rc: integer;
  aSQL, ErrMsg: ansistring;
begin
  aSql := 'BEGIN TRANSACTION; ';
  aSql := aSql + 'SELECT * FROM Table2;';

  aSql := aSql + 'COMMIT TRANSACTION;';
  rc   := sqlite3_exec(sqlite, PChar(ASql), @MyCallback, nil, @ErrMsg);
  if rc <> SQLITE_OK then
    ShowMessage('Select error');
end; 

procedure CloseDb;
begin
  sqlite3_close(sqlite);
end;
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08

Re: sqlite3 и SIGSEGV

Сообщение Padre_Mortius » 15.03.2010 16:02:36

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

Re: sqlite3 и SIGSEGV

Сообщение krab » 15.03.2010 18:17:54

Padre_Mortius писал(а):Проверьте правильность использования sqlite3_prepare

Проверил несколько раз по документации sqlite, а так же сверил с этим фрагментом:
http://www.freepascal.ru/forum/viewtopic.php?p=2150#p2150

Все должно быть в порядке. Но, тем не менее, не работает. :|

Добавлено спустя 2 часа 7 минут 30 секунд:
Нашел ошибку.

Нужно было вместо
Код: Выделить всё
rc := sqlite3_prepare(sqlite, PChar(aSql), -1, stmt, @ErrMsg);
написать
Код: Выделить всё
rc := sqlite3_prepare(sqlite, PChar(aSql), -1, @stmt, @ErrMsg);


Добавлено спустя 25 минут 1 секунду:
Наиболее полезным источником оказался lazarus\fpc\2.2.4\source\packages\fcl-db\src\sqlite.
krab
постоялец
 
Сообщения: 108
Зарегистрирован: 17.02.2010 18:23:08


Вернуться в Lazarus

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

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

Рейтинг@Mail.ru