我使用以下代码通过Qt IDE连接到数据库。如果它成功连接到数据库Connected to db
则打印在标签上。但问题是,如果我甚至给出了错误的数据库路径,它会在标签上返回Connected to db
,我该如何纠正这个问题?
QSqlDatabase mydb= QSqlDatabase::addDatabase("QSQLITE");
mydb.setDatabaseName("x");
if(!mydb.open()){
ui->label->setText("Failed to open the db");
}
else{
ui->label->setText("Connected to db");
}
尽管在上面的代码中我输入了"x",这不是有效的数据库路径,但在运行程序时,我在标签中得到了"连接到数据库"!
如何更正此问题?
Qt使用SQLite后端使用sqlite
库,因此您将使用其中一个函数来打开数据库:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
int sqlite3_open16(
const void *filename, /* Database filename (UTF-16) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
int sqlite3_open_v2(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb, /* OUT: SQLite db handle */
int flags, /* Flags */
const char *zVfs /* Name of VFS module to use */
);
根据文档:
这些例程打开 SQLite 数据库文件,如 文件名参数。文件名参数被解释为 UTF-8 sqlite3_open(( 和 sqlite3_open_v2(( 以及本机字节中的 UTF-16 订购 sqlite3_open16((。数据库连接句柄通常是 在 *ppDB 中返回,即使发生错误也是如此。唯一的例外是 如果 SQLite 无法分配内存来保存 sqlite3 对象,则NULL 将被写入 *ppDb 而不是指向 sqlite3 的指针 对象。如果数据库已成功打开(和/或创建(,则 返回SQLITE_OK。否则将返回错误代码。这 sqlite3_errmsg(( 或 sqlite3_errmsg16(( 例程可用于获取 失败后错误的英文描述 任何 sqlite3_open(( 例程。
由此我们得出结论,如果数据库不存在,这将创建它,只有在分配内存出现问题时才会在创建它时生成错误。