Тут такая проблема организовалась: есть две базы данных, одна создается в памяти, вторая берется из файла.
QSqlDatabase db_mem = QSqlDatabase::addDatabase("QSQLITE");
QSqlDatabase db_file = QSqlDatabase::addDatabase("QSQLITE");
db_mem.setDatabaseName(":memory:");
db_file.setDatabaseName("file_db");
QSqlDatabase db_mem = QSqlDatabase::addDatabase("QSQLITE", "db_mem");
QSqlDatabase db_file = QSqlDatabase::addDatabase("QSQLITE", "db_file");
QSqlDatabase db_mem = QSqlDatabase::database("db_mem");
QSqlQuery query(db_mem);
QString querystr;
querystr="SELECT COUNT(*) FROM MYTABLE";
query.exec(querystr);
получается, что в любой части программы (в любом классе) я могу сделать следующее:
QSqlQuery query(db_mem);
QSqlQuery query(db_mem);
QSqlDatabase db_mem = QSqlDatabase::addDatabase("QSQLITE", "db_mem");
QSqlDatabase db_file = QSqlDatabase::addDatabase("QSQLITE", "db_file");
db_mem.setDatabaseName(":memory:");
db_file.setDatabaseName("file_db");
QSqlDatabase db_mem = QSqlDatabase::database("db_mem");
QSqlDatabase db_file = QSqlDatabase::database("db_file");
QSqlQuery query1(db_mem);
QSqlQuery query2(db_file);
QString querystr;
querystr="SELECT COUNT(*) FROM MYTABLE";
query1.exec(querystr); // Выбор кол-ва записей из таблицы MYTABLE БД ":memory:"
querystr="SELECT COUNT(*) FROM MYTABLE";
query2.exec(querystr); // Выбор кол-ва записей из таблицы MYTABLE БД "file_db"
// Открываем БД
if (!db_mem.open())
{
QString qerr = db_mem.lastError().text();
QMessageBox::critical(0, QObject::tr("Ошибка БД"),
QObject::tr("Невозможно открыть БД.\n\r")+qerr,
QMessageBox::Cancel);
return;
}
Не, то что надо открывать эт я уже понял, а как тогда закрвать? Или закрывать все таки не надо?
PS Просто седня с 7 утра сижу за компом, уже ниче не соображаю
close() , я предпочитаю закрывать, может Qt и сама может это сделать при закрытии программы, я не вкурсе.
А как быть, если я в процессе работы программы хочу открыть новую БД (возможно даже другого типа, например QPSQL)? Пробовал close(),получаю при открытии ругань
QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
bool mainWindow::connectDB() {
//static bool first=true;
//if(first) {
db = QSqlDatabase::addDatabase(cnf.dbType);
//first=false;
//}
db.setDatabaseName(cnf.dbName);
db.setHostName(cnf.server);
db.setUserName(cnf.username);
db.setPassword(cnf.password);
if(!db.open()) {
QMessageBox::warning(this, tr("Database error!"), db.lastError().text());
return false;
}
return true;
}
void mainWindow::disconnectDB() {
if(db.isOpen()) {
db.close();
QSqlDatabase::removeDatabase(db.connectionName()); // correct
}
}
У меня нет отпкрытых запросов. У меня вообще в моём приложении пока что их нет. БД просто открывается и закрывается (полностью, через QSqlDatabase::removeDatabase).
Я вообще вызываю db.close(); перед вызовом removeDatabase, который как написано в документации должен
Closes the database connection, freeing any resources acquired, and invalidating any existing QSqlQuery objects that are used with the database.
db = QSqlDatabase::addDatabase(cnf.dbType);
QSqlDatabase firstDB = QSqlDatabase::addDatabase("QMYSQL", "first");
QSqlDatabase secondDB = QSqlDatabase::addDatabase("QMYSQL", "second");
Как только соединение инициализировано, мы должны вызвать QSqlDatabase::open() для открытия бызы данных и получения доступа к данным. Если запрос соединения потерпит неудачу, функция возвратит false; информацию об ошибке можно получить из QSqlDatabase::lastError(). QSqlDatabase defaultDB = QSqlDatabase::database();
QSqlDatabase firstDB = QSqlDatabase::database("first");
QSqlDatabase secondDB = QSqlDatabase::database("second");
ViGOur, да можно и так как он, открывать/закрывать. Непонятно почему ошибку при закрытии выдает. Arceny, у тебя нигде модели нет связаной с БД, той что из концепции Модель/Представление ?
В общем всё понятно. В моей переменной cnf.dbType (QString) как раз и хранится тип драйвера БД - QSQLITE или QPSQL. В таком случае мне будет логичнее создать 2 объекта QSqlDatabase, в первом будет БД типа QSQLITE, во втором - QPSQL. При необходимости изменить хост/имя базы я вызываю db.close(), потом db.set*(), потом db.open() ... Так? Таким образом QSqlDatabase::removeDatabase() для перезагрузки драйвера под другой тип базы вызвать не прийдётся.
Нет, модели ещё нет. Модель будет :-)
Угу, именно так.
Просто в данном случае QSqlDatabase является синглтоном, а при вызове:
QSqlDatabase firstDB = QSqlDatabase::addDatabase("QMYSQL", "first");
QSqlDatabase secondDB = QSqlDatabase::addDatabase("QMYSQL", "second");
создаются два именованных синглтона, и их можно создать сколько угодно.На счет этого сообщения:
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)