2015-08-04 3 views
0

В other question я узнал, как правильно привязывать параметры к подготовленным операторам SQL. Однако я обнаружил, что sqlite3_step() возвращается с SQLITE_DONE, если я не связываю все параметры. Я бы предпочел считать это ошибкой. Кроме того, я не знаю, если это является источником ошибок в моем коде, поэтому мои вопросы направлены на понимание того, как отлаживать поведение SQLite во время процесса связывания:Как отлаживать параметры привязки в SQLite3?

  1. Как я могу определить, какие параметры не заданы ?
  2. Могу ли я как-нибудь увидеть инструкцию с привязанными параметрами в целях отладки?
  3. Почему SQLite не отвечает SQLITE_NOT_ALL_PARAMETERS_SET или SQLITE_ERROR, если не все параметры установлены?

ответ

1

Если вы добавите «объяснение» перед запросом, он выведет план запроса. В вашем случае:

addr opcode  p1 p2 p3  p4   p5 
0  Init  0 11 0     00 NULL 
1  OpenRead 0 2 0  2   00 NULL 
2  Variable 2 1 0  ?2   00 NULL 
3  MustBeInt 1 9 0     00 NULL 
4  NotExists 0 9 1     00 NULL 
5  Column  0 1 2     00 NULL 
6  Ne   3 9 2  (BINARY) 52 NULL 
7  Copy  1 4 0     00 NULL 
8  ResultRow 4 1 0     00 NULL 
9  Close  0 0 0     00 NULL 
10  Halt  0 0 0     00 NULL 
11  Transaction 0 0 7  0   01 NULL 
12  TableLock 0 2 0  Names  00 NULL 
13  Variable 1 3 0  ?1   00 NULL 
14  Goto  0 1 0     00 NULL 

Использование https://www.sqlite.org/opcode.html в качестве ссылки, говорит нам о том, что он проверяет, является ли ваш вар 2 является INT, и если нет, то он переходит к инструкции 9: Закрыть, а затем останавливается.

ps: Я использовал DB Browser для SQLite для захвата вашего плана выполнения, Следующий шаг (для вас) - выяснить, можете ли вы запросить это? 2 должен быть int или как он должен обрабатывать случай сбоя ,

0

Если привязка завершается успешно, но sqlite3_step() этого не делает, убедитесь, что текст или blob, которые вы связываете, еще не уничтожены. Альтернативой является использование SQLITE_TRANSIENT в качестве последнего параметра в sqlite3_bind_text(). SQLITE_TRANSIENT делает копию того, что связано.

1
  1. Любые параметры, которые вы не сделали явный набор с sqlite3_bind_*() имеют значение по умолчанию NULL в.

    Это означает, что все параметры всегда установлены.

  2. Нет функции для считывания значений параметров; предполагается, что вы знаете значения, потому что вы сами установили их.

Смежные вопросы