在我的构造函数(qt 5.4.1 - windows 7)中:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
db.open();
QSqlQuery q;
q.exec("create table authors(num integer, birthdate date)");
q.exec("insert into authors values('123', '2015-01-01')");
qDebug()<<"your info saved in db.";
到目前为止,每件事情都可以,但是之后,我需要更改我的数据库并永久保存一些日期,所以:
int Dialog::SaveInfosPermanent()
{
QSqlDatabase::database().close();
if ( QSqlDatabase::database().isOpen ()) {
qDebug()<<"DB is open.";
return 1;
}
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("newDB.db");
db.open();
QSqlQuery q;
q.exec("create table authors(num integer, birthdate date)");
q.exec("insert into authors values('123', '2015-01-01')");
qDebug()<<"your info saved in db.";
return 0;
}
并输出:
your info saved in db.
QSqlError("", "", "")
DB is open.
那么我做错了什么?或者,如果用户选择某个复选框,还有更好的其他想法可以将db从内存更改为硬盘吗?
答案 0 :(得分:0)
对我来说,初始化数据库连接的最佳方法是使用连接名称:
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
使用连接名称,您有一些额外的机会。 从数据库连接列表中删除数据库,查找文档here:
QSqlDatabase::removeDatabase(connectionName);
按名称访问您的数据库,找到文档here:
QSqlDatabase db = QSqlDatabase::database(connectionName);
在您的情况下,使用带有连接名称的removeDatabase()
,但不要忘记db
的范围。请参阅我附加链接的示例。
在这两种情况下,您也可以使用同名的数据库,docs说:
使用驱动程序将数据库添加到数据库连接列表中 类型和连接名称connectionName。如果已经存在了 数据库连接名为connectionName,该连接已被删除。
数据库连接由connectionName引用。新的 添加了数据库连接。