为什么它连续地连接路径是正确还是错误

时间:2014-08-18 04:44:33

标签: c++ database qt sqlite qt5

我编写了以下代码来连接sqlite数据库文件。

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("c://database.db");
if(!db.open())
    ui->label->setText(ui->label->text() + "Failed to connect to database");
else
    ui->label->setText(ui->label->text() + "Connected.");

如果将正确的路径改为另一条错误的路径(例如c://datafile.dbc:database.db),则会保留Connected.文字。{/ p>

注意:如果数据库文件不存在,或者正确的路径更改为另一个错误的路径,它将在错误的路径中创建一个空的数据库文件。

我的代码是否始终打印Connected是否存在任何问题?

2 个答案:

答案 0 :(得分:2)

如果您使用的是SQLite,那么它将始终尝试创建数据库文件(如果可以)。这可能不是您想要的 - 例如,如果您需要使用预先存在的数据库中的数据。在尝试打开之前,您应该做的是验证文件是否存在于磁盘上

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

QFile file ("c:/database.db");
if (file.exists()) {
  if(!db.open()) {
    ui->label->setText(ui->label->text() + "Failed to connect to database");
  }
  else {
    ui->label->setText(ui->label->text() + "Connected.");
  }
}
else {
  ui->table->setText("Database does not exist!");
}

请注意,正斜杠/适用于任何平台,并且比使用\字符进行转义更不容易混淆。为了获得更好的可移植性,您应该使用C:/QDir::root()中的内容替换硬编码的QDir::drives()

答案 1 :(得分:0)

我无法在文档中发现它,但有些mailing list threads建议QSqlDatabase::open始终返回true,因为如果存在,它将创建一个空数据库给定路径上没有数据库。请注意,正如其他人所指出的那样,C://database.db很可能是一个有效的路径 - 大多数C ++库接受' /'作为Windows上的路径分隔符。库也很常见地将您提供的路径转换为规范路径,这通常涉及清除驱动器名称后的额外路径分隔符和缺少路径分隔符等内容。