Работа с подготовленными запросами (QSqlQuery::prepare) (Firebird 2.1), оптимизация запросов, кэширование, транзакции |
Здравствуйте, гость ( Вход | Регистрация )
Работа с подготовленными запросами (QSqlQuery::prepare) (Firebird 2.1), оптимизация запросов, кэширование, транзакции |
Steklova Olga |
3.2.2014, 19:23
Сообщение
#1
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Всем привет
Пишу класс для работы с БД. Написала метод класса, выполняющий подключение к БД. Написала метод класса, выполняющий вставку записей в таблицу. В таком виде он работает. Метод insertToDB() в процессе работы программы вызывается многократно.В результате, каждый раз подготавливается один и тот же запрос. Как сделать так, чтобы запрос подготавливался только один раз? Я хотела вынести подготовку запроса в другой метод класса, который можно будет вызвать однократно. Насколько я понимаю, для этого queryIns_T_BLOCK должно быть известно в обоих этих методах. Еще не написав доп. метод, а только выполнив перенос описания QSqlQuery queryIns_T_BLOCK сюда у меня перестала работать подготовка запроса. prepare стал выдавать ошибку Driver not loaded. Не понимаю, в чем дело. Экземпляры класса QSqlQuery могут быть только локальными переменными? Сообщение отредактировал Steklova Olga - 7.2.2014, 18:45 |
|
|
Steklova Olga |
10.2.2014, 16:34
Сообщение
#2
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
9)
на мой вгляд это лишнее условие Обычно я проверяю это условие, чтобы отдельно проверить правильность формирования строки squery. Ведь она не всегда столь тривиальна.Хотя в доке и сказано, что bool QSqlQuery::prepare ( const QString & query ) Prepares the SQL query for execution. Returns true if the query is prepared successfully; otherwise returns false. Portability note: Some databases choose to delay preparing a query until it is executed the first time. In this case, preparing a syntactically wrong query succeeds, but every consecutive exec() will fail. 10)
Если ты хочешь проверить успешность запроса, то смотри что возвращает exec(), а не активность/неактивность. Часто isActive() будет возвращать Ложь В доке сказано, что bool QSqlQuery::exec ( const QString & query ) Executes the SQL in query. Returns true and sets the query state to active if the query was successful; (isActive == true) otherwise returns false. (здесь нельзя рассчитывать, что isActive == false?) bool QSqlQuery::exec () Executes a previously prepared SQL query. Returns true if the query executed successfully; (здесь можно рассчитывать, что isActive == true?) otherwise returns false. (здесь нельзя рассчитывать, что isActive == false?) bool QSqlQuery::isActive () const Returns true if the query is active. An active QSqlQuery is one that has been exec()'d successfully but not yet finished with. When you are finished with an active query, you can make the query inactive by calling finish() or clear(), or you can delete the QSqlQuery instance. А если q.exec(squery) вернет true, то разве q.isActive() может при этом вернуть false? Я ведь не делаю для запроса finish(), clear() или delete. |
|
|
Текстовая версия | Сейчас: 1.12.2024, 2:55 |