9
回答
抓狂!QT5.5连接mysql数据库问题
华为云实践训练营,热门技术免费实践!>>>   

先上代码:

QSqlDatabase data_base = QSqlDatabase::addDatabase("QMYSQL");
    data_base.setHostName("10.18.96.31");  //设置主机地址
    data_base.setPort(3306);  //设置端口
    data_base.setDatabaseName("test");  //设置数据库名称
    data_base.setUserName("root");  //设置用户名
    data_base.setPassword("s");  //设置密码
    if(!data_base.open())
        qDebug()<<"failed to connect to mysql";
    else
        qDebug()<<"success";

mac和windows下都试过了,不管主机、用户名、密码等参数为任何值,open时返回都是true,然后查表数据就是失败,求大虾指点!


举报
鸣泽晨
发帖于2年前 9回/7K+阅
共有9个答案 最后回答: 2年前
各位,我的不是“QMYSQL driver not loaded”问题,数据库驱动已经加载成功。问题是不管主机、用户名、密码等参数为任何值,open时返回都是true,然后查表数据就是失败
 我遇到了和您一样的问题,参数随意改都是返回true,同样的代码放在Qt5.4里就正常。不知道您最后找到解决方案了没?
--- 共有 2 条评论 ---
流轩弦影回复 @鸣泽晨 : 好的,谢谢。 2年前 回复
鸣泽晨不知道是不是QT5.5的Bug,不过只要参数正确,后续的查询、插数据都可以。现在我的处理是连接后接着做一个简单的查询来判断是否正常连接。 2年前 回复
QSqlDatabase db = QSqlDatabase :: addDatabase ( "QMYSQL" );
 db.setHostName(_ipAddress);
 int port = _databasePort.toInt(&ok,10);
 db.setPort(port);
 db.setDatabaseName(_databaseName);
 db.setUserName(_databaseUserName);
 db.setPassword(_databaseUserPassword);
 QString testOnBorrowSql("SELECT 1+1 ");
 
 QSqlQuery query(testOnBorrowSql, db);
 if (query.lastError().type() != QSqlError::NoError && !db.open()) {
 qDebug() << "Open datatabase error:" << db.lastError().text();
 QMessageBox::warning(this,"错误警告!", tr("数据连接不成功! %0").arg(db.lastError().text()));
 }
 else
 {
 QMessageBox::information(this,"成功消息","数据库连接测试成功!");
 }
 我是这样写的。

重新写了一边,看看对你有没有帮助。

 QString _databaseName = ui->lineEdit_database_name->text();

 QString _databaseUserPassword = ui->lineEdit_database_password->text();


 QString _databasePort = ui->lineEdit_database_port->text();


 QString _ipAddress = ui->lineEdit_ip_address->text();


 QString _databaseUserName = "root";


 bool ok;


 


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


 db.setHostName(_ipAddress);


 int port = _databasePort.toInt(&ok,10);


 db.setPort(port);


 db.setDatabaseName(_databaseName);


 db.setUserName(_databaseUserName);


 db.setPassword(_databaseUserPassword);


 QString testOnBorrowSql("SELECT * FROM test_table");


 ok = db.open();


 QSqlQuery query(db);


 query.exec(testOnBorrowSql);


 int effectedNum = query.numRowsAffected();


 


 if(effectedNum > 0)


 {


 QMessageBox::information(this,"成功消息","数据库连接测试成功!");


 }


 else


 {


 qDebug() << "Open datatabase error:" << db.lastError().text();


 QMessageBox::warning(this,"错误警告!", tr("数据连接不成功! %0").arg(db.lastError().text()));


 } 


 query.clear();


 db.close();

在 5.5/Src/qtbase/src/sql/drivers/mysql/qsql_mysql.cpp代码有问题

重新编译插件就好了

diff --git a/qsql_mysql.cpp b/qsql_mysql.cpp

index 04a1be1..b9bffd5 100644
--- a/qsql_mysql.cpp
+++ b/qsql_mysql.cpp
@@ -1273,7 +1273,12 @@ bool QMYSQLDriver::open(const QString& db,
         }
     }
 
-    if ((d->mysql = mysql_init((MYSQL*) 0))) {
+    if (!(d->mysql = mysql_init((MYSQL*) 0))) {
+        setLastError(qMakeError(tr("Unable to allocate a MYSQL object"),
+            QSqlError::ConnectionError, d));
+        setOpenError(true);
+        return false;
+    }
 #if MYSQL_VERSION_ID >= 50000
         if (connectTimeout != 0)
             mysql_options(d->mysql, MYSQL_OPT_CONNECT_TIMEOUT, &connectTimeout);
@@ -1305,7 +1310,7 @@ bool QMYSQLDriver::open(const QString& db,
             if (reconnect)
                 mysql_options(d->mysql, MYSQL_OPT_RECONNECT, &reconnect);
 #endif
-        }
+        
     } else {
         setLastError(qMakeError(tr("Unable to connect"),
                      QSqlError::ConnectionError, d));

顶部