Qt 5.4,数据库未打开错误

Posted

技术标签:

【中文标题】Qt 5.4,数据库未打开错误【英文标题】:Qt 5.4, database not open error 【发布时间】:2015-03-15 14:08:49 【问题描述】:

我是 C++/Qt 新手,正在尝试写入我在项目根目录中创建的 SQLite 数据库。

以下是我用作参考的众多网站之一: http://www.java2s.com/Code/Cpp/Qt/ConnecttoSqliteanddoinsertdeleteupdateandselect.htm

我创建了一个函数,它接收所有用户输入值的参数作为对象。我想将用户输入的这些值写入我的根目录数据库。

这是获取数据库对象并尝试将它们写入我的根级数据库“matrixics.db”的函数。

我的职能:

#include <QtSql>
#include <QSqlDatabase>
#include <QtDebug>
#include <QFile>
#include <QMessageBox> 

void db_connection::writeDBValues(db_config *dbInfo)
    
        //connect to matrixics.db
        QSqlDatabase matrixics = QSqlDatabase::addDatabase("QSQLITE", "MatrixICS");
        //using absolute path doesn't work either            
        //matrixics.setDatabaseName("D:/Qt Projects/build-MatrixICS-Desktop_Qt_5_4_0_MinGW_32bit-Debug/matrixics.db");
        matrixics.setDatabaseName("./matrixics.db");

        if(!QFile::exists("./matrixics.db"))
        
            QString failedMsg = tr("FAILED: Could not locate matrixics.db file");
            QMessageBox::warning(this, tr("ERROR: Failed MatrixICS Database Connection!"), failedMsg);
        
        else if (!matrixics.open())
        
            QString failedMsg = tr("FAILED: ") + matrixics.lastError().text();
            QMessageBox::warning(this, tr("ERROR: Failed to open matrixics.db!"), failedMsg);
        
        else
        
            //write db values
            QSqlQuery qry;

            if (m_connectionName == "localDb")
            
                qry.prepare( "INSERT INTO settings (local_db_type, local_db_host, local_db_port, local_db_user, local_db_pass) VALUES (?, ?, ?, ?, ?)" );
            
            else if (m_connectionName == "remoteDb")
            
                qry.prepare( "INSERT INTO settings (remote_db_type, remote_db_host, remote_db_port, remote_db_user, remote_db_pass) VALUES (?, ?, ?, ?, ?)" );
            

            //bind all values
            qry.addBindValue(dbInfo->m_db_type);
            qry.addBindValue(dbInfo->m_hostname);
            qry.addBindValue(dbInfo->m_port);
            qry.addBindValue(dbInfo->m_db_user);

            //encode user pass
            //base64_encode is included in a globals.h fn not shown above
            QString encodedPass = base64_encode(dbInfo->m_db_pass);
            qry.addBindValue(encodedPass);

            if(!qry.exec()) qDebug() << qry.lastError();

            matrixics.close();

        

        QSqlDatabase::removeDatabase("MatrixICS");
    

错误:

QSqlQuery::prepare: database not open
QSqlError("", "Driver not loaded", "Driver not loaded")
QSqlDatabasePrivate::removeDatabase: connection 'MatrixICS' is still in use, all queries will cease to work.

我的问题:

脚本如何在不打开数据库的情况下将其归结为QSqlQuery::prepare 函数?我认为当我执行if (!matrixics.open()) 时,如果数据库未打开,脚本会抛出我的“无法打开”消息。然而,事实并非如此,所以逻辑应该表明数据库实际上是打开的,但我收到了QSqlQuery::prepare: database not open

【问题讨论】:

阅读文档后有一个大胆的猜测:您的QSqlQuery 对象必须使用对QSqlDatabase 的引用来构造。 IOW:写那行QSqlQuery qry(matrixics); 天哪,就是这样。非常感谢克里斯蒂安。我知道它必须很简单,不知道为什么我的示例站点都没有显示引用 QSqlDatabase 对象的查询。看起来我需要在遵循文档和更少的示例方面做得更好;)您想发表您的评论作为答案,以便我可以选择它吗? 我对Qt不是很熟悉。也许那些其他网站使用“应用程序的默认数据库”,不管是什么。 【参考方案1】:

您的QSqlQuery 对象必须使用对QSqlDatabase 的引用来构造。换句话说,让那条线

QSqlQuery qry(matrixics);

QSqlQuery::QSqlQuery documentation。

【讨论】:

以上是关于Qt 5.4,数据库未打开错误的主要内容,如果未能解决你的问题,请参考以下文章

Qt 串行端口错误 - 未读取数据

连接 DLL 后出现 QT 5.4 错误

带有 Visual Studio 2013 的 Qt 5.4 - 缺少 QtCored.dll

站点打开后未加载 Laravel 5.4 服务提供商

Qt-Creator 中 OpenCV 程序中的链接器错误

尝试 Windows 部署 - .exe 文件未打开且没有错误消息