Qt очищает SQL-запрос - PullRequest
       2

Qt очищает SQL-запрос

3 голосов
/ 03 апреля 2011

В чем разница между

void QSqlQuery::clear ()

и

void QSqlQuery::finish ()

Основываясь на документации , я не вижу, что такое разница.В чем разница?Я хотел бы знать, когда конкретно использовать один над другим.

РЕДАКТИРОВАТЬ - Еще некоторые уточнения и информация из документации.
clear ()
-Очистить результирующий набор и освободить все ресурсы, удерживаемые запросом.
Похоже, что finish () делает то же самое ...

-Задать состояние запроса на неактивное.
Finish выполняетто же самое.

finish ()
-Установите драйвер базы данных, чтобы из этого запроса больше не извлекались данные, пока он не будет выполнен повторно.
Что это значит конкретно?Каковы последствия этого?

-Это может быть полезно для освобождения ресурсов, таких как блокировки или курсоры, если вы собираетесь повторно использовать запрос позже.
Не ясно, делатьтак же?Не снимает блокировки разблокировки, курсоры и т. Д.?

- устанавливает запрос как неактивный.
clear делает то же самое, что я считаю.

- Связанные значения сохраняютсяих значения.
Какой смысл в этом?

Ответы [ 3 ]

5 голосов
/ 03 апреля 2011

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

Итак, согласно исходному коду:

  • clear - очищает и сбрасывает объект QSqlQuery;
  • finish - переводит результат члена текущего запроса в неактивное состояние;

надеюсь, это поможет, с уважением

2 голосов
/ 24 ноября 2015

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

void QSqlQuery::finish ()

Я думаю об этом как о способе сказать, что я закончил с запросом, который я только что запросил (например, больше не читал / не повторял), но я все еще планирую использовать этот объект QSqlQuery для выполнения дополнительной работы. Вы просто освобождаете любую память / ресурсы, используемые для получения значений из предыдущего запроса. Это действительно имеет большое, заметное значение, когда вы имеете дело с большими наборами данных снова и снова, но я считаю хорошей практикой использовать все же.

void QSqlQuery::clear ()

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

Разницу легче понять, если рассматривать ее как написанную для решения аналогичной проблемы в течение двух разных периодов времени (например, старый код C в отличие от современного C ++).

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

0 голосов
/ 16 марта 2015

Для всех, как я, которые задаются вопросом, какой метод вызывать.Я поделюсь своим исследованием.

ПРИМЕЧАНИЕ: Я прочитал источники драйвера SQLite, поэтому другие драйверы баз данных могут отличаться.

  • finish () сбрасываетзаявление;в контексте SQLite он вызывает sqlite3_reset;
  • clear () сбрасывает весь QSqlQuery объект;очищает связанные значения, подготовленный оператор, lastError (), lastQuery () ..., устанавливает параметры по умолчанию для всех параметров объекта;в контексте SQLite я думаю, что sqlite3_finalize также называется;

Так что я должен визуализировать это так finish < clear.После finish () вы можете вызывать exec () для повторного выполнения запроса, но после clear () вы должны повторно выполнить запрос еще раз и связать его значения, прежде чем сможете успешно выполнить его повторно.

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