Здравствуйте!
Пишу функцию, внутри которой требуется открыть соединение с БД, отработать запрос, а затем его закрыть.
Вначале действовал банально:
someFunction(...) {
...
QSqlDatabase dbSC = QSqlDatabase::addDatabase("QPSQL", CONNECT_NAME);
dbSC.setHostName("...");
dbSC.setPort(...);
dbSC.setDatabaseName("...");
dbSC.setUserName("...");
dbSC.setPassword("...");
if (!dbSC.open()) {
//Нет связи с БД
}
else {
...
QSqlQuery query("...", dbSC);
...
}
if (dbSC.isOpen()) { dbSC.close();}
return;
}
Эту функцию вызывал в программе несколько раз. И вот тут мне начали выдавать сообщения, что соединение CONNECT_NAME, оказывается, закрыто не было и его переподключают. Я знал правило, что для корректного закрытия соединения нельзя оставлять открытых запросов (и, добавлю, неудаленных динамически созданных моделей). Но запрос, вроде, создавался в стеке и должен был заблаговременно уничтожаться по выходе из оператора else.
Начал камлать, дополнительно эксперементируя с функцией QSqlDatabase::removeDatabase(CONNECT_NAME) и пытаясь прибить соединение лопатой. Выяснил, что данная функция работает, но только тогда, когда уничтожена и переменная запроса, и переменная dbSC! Пришлось ставить скобки "в чистом поле".
someFunction(...) {
...
{ <----------!!
QSqlDatabase dbSC = QSqlDatabase::addDatabase("QPSQL", CONNECT_NAME);
dbSC.setHostName("...");
...
if (!dbSC.open()) {
//Нет связи с БД
}
else {
...
QSqlQuery query("...", dbSC);
...
}
} <------------!!!
QSqlDatabase::removeDatabase(CONNECT_NAME);
return;
}
Вроде, всё работает, но всё равно хочу уяснить - что это было, за что и правильно ли я это понял? )))