Qt开发 - 使用 ODBC 连接数据库遇到的坑

遇到的问题

学习了 Qt 中,正好学到了数据库的连接,看了点内容挥挥手去编代码,使用 ODBC ,结果连不上数据库。怀疑是驱动的问题,废了老大劲去编译 MySQL 数据库驱动,结果跟这玩意没有关系。归根到底还是 C++ 类的内核本质。

问题代码

这是一段错误代码

这里创建了一个数据库对象指针,然后用数据库对象指针进行数据库的 IP、端口、账号、密码赋值,然后使用 ODBC 连接数据库。

#if 0
    QSqlDatabase *database = new QSqlDatabase();
    database->addDatabase("QODBC");
    database->setHostName("127.0.0.1");
    database->setPort(3306);
    database->setDatabaseName("MySQL");
    database->setUserName("root");
    database->setPassword("@mysql");

    if(database->open()){
    	QMessageBox::information(this,"恭喜","数据库连接成功");
	}else{
    	QMessageBox::warning(this,"提示","数据库连接失败");
	}
#endif
运行结果

database->open()的结果是false,弹出了如下窗口,显然我的数据库连接失败。

在这里插入图片描述

查找问题

驱动?(否)

这里我使用database->lastError()在打开数据库之后,来获取数据库遇到的错误。

此外还使用QSqlDatabase::drivers()来获取 Qt 支持的数据库驱动。

代码做出了一点点修改。

    bool is_OK = database->open();
    qDebug()<<database->lastError().text()<<endl;
	QStringList qsl= QSqlDatabase::drivers();
    qDebug()<<qsl.join(",")<<endl;
        if(is_OK){
    	QMessageBox::information(this,"恭喜","数据库连接成功");
	}else{
    	QMessageBox::warning(this,"提示","数据库连接失败");
	}

得到的结果:

数据库还是连接不上,这里得到了一些信息。

“Driver not loaded Driver not loaded”

“QSQLITE,QMYSQL,QMYSQL3,QODBC,QODBC3,QPSQL,QPSQL7”

这里说明了一件事情,我用来连接数据库的驱动也许有问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dEbMweuO-1688549887898)(C:\Users\UZALWONG\AppData\Roaming\Typora\typora-user-images\image-20230705160917105.png)]

然后我就在互联网上挖呀挖呀,“ODBC驱动出问题怎么办?”、“Driver not loaded Qt 数据库”。

当然并不是驱动那一回事。

数据库对象的赋值?(对)

我按网上的内容来拷贝驱动、编译驱动,结果还是一样的结果,我开始绝望了。

等等,我的驱动文件夹里有 ODBC 的驱动。

在这里插入图片描述

那问题出在哪里呢?

这时我又增加了一段代码

qDebug()<<database->databaseName()<<endl;

我发现这里输出的值竟然为空,感情我给数据库对象的赋值没成功。

在这里插入图片描述

这时我参考了其他的 Qt 使用 ODBC 连接数据库的案例,好家伙,就我一个用数据库对象指针。

然后,我把原来的数据库对象指针全换成对象标识符了。

解决方法

将数据库对象指针全换成普通的对象标识符。

#if 1
    QSqlDatabase database = QSqlDatabase::addDatabase("QODBC");
    database.setHostName("127.0.0.1");
    database.setPort(3306);
    database.setDatabaseName("MySQL");
    database.setUserName("root");
    database.setPassword("@mysql");

    if(database.open()){
    	QMessageBox::information(this,"恭喜","数据库连接成功");
	}else{
    	QMessageBox::warning(this,"提示","数据库连接失败");
	}
	qDebug()<<database.databaseName()<<endl;
#endif

运行结果:

在这里插入图片描述

这里的database.databaseName()的内容是我在 ODBC 中设置的 MySQL的,数据库连接成功了。

为什么?

addDatabase()是静态方法
[static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String(defaultConnection))

addDatabase()是一个静态函数,它不属于任何一个QSqlDatabase对象,而是属于QSqlDatabase类。静态函数只能通过类名来调用,不能通过对象或指针来调用。这里应该把数据库对象定义为一个普通对象而不是对象指针,因为指针操作很复杂。

QSqlDatabase database = QSqlDatabase::addDatabase("QODBC"); // 定义为普通对象
QSqlDatabase database = QSqlDatabase(); // 定义为指针
database = &QSqlDatabase::addDatabase("QODBC");

这里addDatabase("QODBC")产生的地址是一个临时变量,到头来database指向的是空指针,所以没有调用成功 ODBC 的驱动。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐