2016-12-13 4 views
0

Могу ли я использовать ту же переменную QSQLQuery для выполнения нескольких операторов в Qt 5.3.2 с использованием SQLite? Должен ли я вызвать функцию finish или clear после каждого выполнения?Можно ли использовать ту же переменную QSQLQuery для выполнения нескольких операторов?

Например:

QSqlQuery query; 

query.prepare("INSERT INTO myTable (id, name) VALUES (:id, :name)"); 
query.bindValue(":id", id); 
query.bindValue(":name", name); 

if(!query.exec()) 
{ 
    qDebug() << "Error"; 
} 

query.finish() // or query.clear()? 

query.prepare("INSERT INTO myProducts (product, price) VALUES (:product, :price)"); 
query.bindValue(":product", product); 
query.bindValue(":price", price); 

if(!query.exec()) 
{ 
    qDebug() << "Error"; 
} 

query.finish() // or query.clear()? 

Примечание: Я думаю, что нужно использовать функцию finish, но я не понял, что именно эта функция делает clear. В документации указано:

Очищает результирующий набор и освобождает любые ресурсы, хранящиеся в запросе. Задает состояние запроса неактивным.

+1

Что происходит, когда вы запускаете его? Отключив память, я использовал тот же QSqlQuery, что и вы, без выполнения функции finish() или clear(). Мое предположение - такие вещи, как lastError() и isValid(), вероятно, ошибочно, без этого. –

ответ

2

Там нет необходимости использовать какие-либо из этих функций в вашем случае, вы можете делать только штраф без какого-либо из этих двух линий вы спрашиваете о


Могу ли я использовать один и тот же QSqlQuery переменная для выполнения нескольких операторов в Qt 5.3.2 с использованием SQLite?

Конечно, вы можете, но вы не обязаны это делать. Например, если вы хотите выполнить SQL-запрос, и, случается, у вас уже есть действительный объект QSqlQuery, вокруг которого вы закончили (вы не хотите получать от него больше данных), вы можете просто использовать тот же объект QSqlQuery с вашим новым запросом, так как нет необходимости создавать еще один QSqlQuery.

Должен ли я вызывать финиш или функцию очистки после каждого выполнения?

Вот что документы говорят о QSqlQuery::finish():

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

Это означает, что вам нужно использовать его только в том случае, если вы хотите сохранить объект QSqlQuery, который вы закончили в течение длительного времени, чтобы использовать его. Но на самом деле нет необходимости делать это, просто позвольте вашему объекту выйти из сферы действия, когда вы закончите с ним.

А про QSqlQuery::clear():

Очищает набор результатов и освобождает все ресурсы, находящиеся в запросе. Задает состояние запроса неактивным. Вы должны редко использовать эту функцию.

Вы можете посмотреть на Master Detail Example и, в частности createConnection() function, чтобы увидеть, как тот же QSqlQuery объект используется несколько раз.

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