Повторное использование инструкции sqlite3 для нового запроса

#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> может быть запросом выбора…