#c #sqlite
Вопрос:
Чтобы зафиксировать запрос sqlite в C , нам нужно создать sqlite3_stmt
, подготовить его с помощью sqlite3_prepare_v2
sqlite3_bind_
потенциальных значений для оператора, а затем sqlite3_step
через него.
Теперь, в функции, которая, например, выполняет два отдельных запроса sqlite, могу ли я просто повторно использовать то же sqlite3_stmt
самое, вызвав sqlite3_prepare_v2
его снова, или мне нужно заранее явно sqlite3_reset
указать оператор?
Напр.
void mySqliteFunction() {
sqlite3_stmt* stmt;
int rc;
rc = sqlite3_prepare_v2(<connection>, <sql string>, ..., amp;stmt, ...);
rc = sqlite3_step(stmt);
if (rc == SQLITE_OK) {
rc = sqlite3_prepare_v2(<connection>, <other sql string>, ..., amp;stmt, ...); // is this valid?
rc = sqlite3_step(stmt);
}
rc = sqlite3_finalize(stmt);
return;
}
Комментарии:
1. Зачем готовить одно утверждение, а затем сразу же отбрасывать его?
2. @jarmod Спасибо, я забыл
step
в псевдокоде и соответствующим образом обновил свой вопрос. Теперь вы понимаете, что я имею в виду?
Ответ №1:
Переменная stmt
подготовленного оператора в вашем коде просто содержит дескриптор для подготовленного оператора, и ее значение заполняется sqlite3_prepare_v2()
вызовом.
Проблема в вашем коде в настоящее время заключается в том, что вы не выполнили правильную доработку. Вы несете ответственность за удаление скомпилированной инструкции SQL с помощью sqlite3_finalize()
. Если вы правильно завершили начальную подготовленную инструкцию после использования, вы можете повторно stmt
использовать переменную, в противном случае происходит утечка ресурсов.
sqlite3_reset()
Функция предназначена для сброса данного подготовленного оператора, чтобы разрешить его повторное выполнение. Он не предназначен для случая, когда вы на самом деле подготовите другую инструкцию SQL.
Комментарии:
1. Важно отметить, что я не хочу использовать его для выполнения точно такого же оператора с другими привязками. Первый
<sql string>
может вставить строку, второй<other sql string>
может быть запросом выбора…