Sqlite WHERE предложение и значения длинного слова Delphi XE - PullRequest
0 голосов
/ 21 января 2011

В Delphi XE я храню хэш crc32 строки в базе данных SQlite в столбце, объявленном как INTEGER.Насколько я понимаю, SQlite не различает целочисленные типы: int, int64, подписанные и неподписанные, все они одинаковы в отношении базы данных.Однако, когда я сохраняю значение, объявленное как longword в Delphi, предложение WHERE не совпадает с этим значением позже.

Мой оператор вставки (обрезанный здесь):

INSERT INTO main VALUES (id, crc) (?, ?);

Значение длинного слова связывается со вторым параметром, и все идет хорошо.Но когда я выполняю

SELECT id FROM main WHERE crc = ?;

, запрос не возвращает результатов.

Просмотр базы данных в SQLiteSpy , значения длинных слов отображаются как отрицательные целые числа.Если я выполню вышеупомянутый SELECT с отрицательным значением, скопированным и вставленным из этого дисплея, запрос вернет ожидаемую запись.

Может показаться, что когда я связываю значение длинного слова с оператором INSERT, SQLIte что-то делаетиначе тогда, когда я привяжу то же значение длинного слова к оператору SELECT.Преобразование значения в целое число (в коде Delphi, а не в SQL) устраняет проблему, но в этом нет необходимости, и будет легко забыть преобразовать ее в другие места.Есть ли лучшее решение?SQLite ведет себя правильно?

1 Ответ

1 голос
/ 21 января 2011

Проблема не в SQLite, а в способе привязки ваших параметров к движку SQLite.

В зависимости от используемой вами среды SQlite вы должны явно связать Int64 со своим оператором:

INSERT INTO main VALUES (id, crc) (?, ?);

Например, используя нашу структуру с CRC, объявленным как кардинал, вы должны использовать этот код (а НЕ любое целое число (CRC)):

sqlite3_check(RequestDB,sqlite3_bind_Int64(Request,2,Int64(CRC)));

Если приведенный выше код не работает, он всегда будет работать:

var CRC64: Int64;
    CRC64Rec: TInt64Rec absolute CRC64;
begin
  CRC64Rec.Lo := CRC;
  CRC64Rec.Hi := 0;
  sqlite3_check(RequestDB,sqlite3_bind_Int64(Request,2,CRC64));

Во всех случаях, не показывая свой собственный код с параметрами привязки, трудно понять, что не так в вашем коде.

...