Проблема SQLite с некоторыми параметризованными запросами - PullRequest
0 голосов
/ 09 июня 2010

У меня возникли проблемы с использованием SQLite и параметризованных запросов с несколькими таблицами.Я заметил, что некоторые запросы, использующие SELECT * FROM Table WHERE row=?, возвращают 1 строку, когда должно быть возвращено больше строк.Если я изменяю параметризованный запрос на SELECT * FROM Table WHERE row='row', то возвращается правильное количество строк.

Кто-нибудь знает, почему sqlite3_step вернет только 1 строку при использовании параметризованного запроса по сравнению с использованием того же запроса втрадиционный непараметрический способ?

Я использую очень тонкую оболочку C ++ для SQLite3.Я подозреваю, что может быть проблема с оберткой, но эта проблема существует только в нескольких таблицах.Это заставляет меня задуматься, если что-то не так с настройкой этих таблиц.Любой совет приветствуется.

РЕДАКТИРОВАТЬ: Вот схема простейшей таблицы, показывающей проблему: CREATE TABLE RefNums (ключ TEXT PRIMARY KEY, TripNumber TEXT, RefDesc TEXT, RefNum TEXT);

Я использую запрос:

SELECT * FROM RefNums WHERE TripNumber =?и используя sqlite3_bind_text.Это возвращает SQLITE_ROW при первом вызове sqlite3_step и возвращает SQLITE_DONE при втором вызове sqlite3_step.Там должно быть 2 ряда.Я проверил существование строк с помощью SQLDataBrowser.Если я изменю запрос на SELECT * FROM RefNumbers WHERE TripNumber = '012345';тогда он работает как положено.

1 Ответ

0 голосов
/ 10 июня 2010

Я решил проблему. Этот код работает на платформе Windows CE / Windows Mobile, где практически все системные API-интерфейсы доступны только для Unicode. Я использую утилиту преобразования ATL 7.0 CT2A для преобразования между T (Unicode) в A (Ascii) перед передачей переменной в SQLite через функции sqlite3_bind_xxx. Похоже, это является источником проблемы, потому что та же программа работает правильно, если я жестко закодировал запрос вместо использования параметризованных запросов.

Я изменил оболочку sqlite3_bind_text, чтобы использовать SQLITE_TRANSIENT (SQL создает копию данных) вместо SQLITE_STATIC (SQLite предполагает, что указатель исправлен). Программа теперь работает правильно. Кажется, есть некоторые проблемы с временем жизни временного объекта CT2A и временем жизни объекта sqlite3_stmt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...