![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
Steklova Olga |
![]()
Сообщение
#1
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: ![]() ![]() ![]() |
Всем привет
![]() Пишу класс для работы с БД. Написала метод класса, выполняющий подключение к БД. Написала метод класса, выполняющий вставку записей в таблицу. В таком виде он работает. Метод insertToDB() в процессе работы программы вызывается многократно.В результате, каждый раз подготавливается один и тот же запрос. Как сделать так, чтобы запрос подготавливался только один раз? Я хотела вынести подготовку запроса в другой метод класса, который можно будет вызвать однократно. Насколько я понимаю, для этого queryIns_T_BLOCK должно быть известно в обоих этих методах. Еще не написав доп. метод, а только выполнив перенос описания QSqlQuery queryIns_T_BLOCK сюда у меня перестала работать подготовка запроса. prepare стал выдавать ошибку Driver not loaded. Не понимаю, в чем дело. Экземпляры класса QSqlQuery могут быть только локальными переменными? Сообщение отредактировал Steklova Olga - 7.2.2014, 18:45 |
|
|
![]() |
Litkevich Yuriy |
![]()
Сообщение
#2
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
То есть так? на мой вгляд это:Цитата if (!q.prepare(squery)) лишнее условиеА почему это приводит к увеличению скорости? потому что, когда ты не начинаешь транзакцию явно, то транзакция создаётся не явно, т.е. будет пачка транзакций вместо одной, на каждый "бинд". Это даже на SQLite очень хорошо заметно (для ~50 вставок скорость увеличивается в 2-3 раза)Это стоит сделать независимо из количества выполнений запроса (qntRec)?И при qntRec = 10, и при qntRec = 20000? Я обычно оборачиваю в транзакцию, если циклов потенциально может быть больше 5.“При помещении в базу данных большого количества данных в пакете предпочтительным является разбиение их на группы и подтверждение работы приблизительно через каждые 5000-10000 строк.” У Firebird-а есть точки сохранения (savepoints) и здесь они имеются ввиду. Просто для надёжности, а вдруг связь с сервером прервётся. Но их не поддерживает оригинальный драйвер Qt. На прог.орге человек выкладывал свой драйвер Firebird-а, вроде он их поддерживает.объявить запрос (и использовать это объявление для нескольких запросов), Это всёго лишь экземпляр класса QSqlQuery, но не запрос с точки зрения СУБД.Нужно лишь такое: Для FB откатыватся при ошибках сильно рекомендую, иначе мертвые транзакции так и останутся в БД, т.к. FB хранит версии своих состояний.Недостаточно просто объявить запрос, подготовить его, проверить результат prepare, забиндить значения параметров запроса и выполнить его? Притом обрамив все это в транзакцию. достаточно |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 7.4.2025, 5:31 |