【问题标题】:QT QSqlDatabase open() function creates a sqlite databaseQT QSqlDatabase open() 函数创建一个sqlite数据库
【发布时间】:2016-05-07 22:49:19
【问题描述】:

我正在尝试使用 .open() 函数在 QT 中打开一个 sqlite 数据库文件,如果文件没有退出,.open() 不会返回 false,它只是在给定的文件中创建一个新文件目录。我的代码:

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("C:/sqlite/newDB.db");

    if(!db.open()){
        ui->test->setText("Fail");
    }
    else{
        ui->test->setText("Success");
    }

如何让它返回一个真或假?

【问题讨论】:

    标签: c++ qt sqlite


    【解决方案1】:

    你不能让它返回真或假,这就是它的工作原理。 . .

    但是,您可以在使用QFile::exists("C:\\sqlite\\newDB.db") 打开数据库之前检查文件是否存在。之后,如果它存在,您可以尝试这样的查询以确保它没有损坏:

    QSqlQuery q;
    if(!q.exec("SELECT name, sql FROM sqlite_master WHERE type='table' ;")){
        //corrupt sqlite file
    }
    

    最终代码可能如下所示:

    if(!QFile::exists("C:\\sqlite\\newDB.db")){
        //file does not exist
    }
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("C:\\sqlite\\newDB.db");
    if(!db.open()){
        //Database open error
    }
    {
        QSqlQuery q;
        if(!q.exec("SELECT name, sql FROM sqlite_master WHERE type='table' ;")){
            //corrupt or invalid sqlite file
    }
    

    【讨论】:

    • 你真的测试过这个吗?因为新创建的数据库也会包含系统表。
    • @CL。 ,是的,这是经过测试的。抱歉,系统表是什么?
    • 这是您尝试访问的表。无论如何,我误解了逻辑;这应该可以正常工作。
    • 谢谢。但是,QT 文档说“使用当前连接值打开数据库连接。成功时返回 true;否则返回 false”
    • @ReeSSult ,如果sqlite文件不存在,它会创建一个新的空数据库并连接到它,因此它成功并返回true。 . .由于此行为不适合您,我们先检查文件是否存在。 . .
    猜你喜欢
    • 1970-01-01
    • 2015-03-06
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多