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

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 的驱动。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Qt连接Oracle数据库,需要使用ODBC驱动程序。以下是一些基本步骤: 1. 安装ODBC驱动程序:首先,需要安装适用于Oracle数据库ODBC驱动程序。这通常是通过Oracle官方网站下载并安装Oracle Instant Client完成的。 2. 配置ODBC DSN:接下来,需要在系统中配置ODBC DSN以便连接Oracle数据库。要完成此操作,请打开Windows控制面板,然后转到ODBC数据源。在“用户DSN”选项卡中,单击“添加”按钮并选择合适的Oracle驱动程序。接着,输入DSN名称、服务器名称和其他必要的详细信息。 3. 在Qt中设置ODBC连接:要在Qt连接Oracle数据库,需要使用QSqlDatabase类。以下是一个示例连接代码: ``` QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); db.setDatabaseName("DSN_name"); db.setUserName("username"); db.setPassword("password"); if (!db.open()) { qDebug() << "Failed to connect to database"; } ``` 在上述代码中,DSN_name应替换为您在第2步中创建的DSN名称,而用户名和密码应替换为您的Oracle数据库凭据。 4. 执行查询:一旦建立了数据库连接,您可以使用QSqlQuery类执行查询。以下是一个简单的示例: ``` QSqlQuery query; query.exec("SELECT * FROM my_table"); while (query.next()) { QString name = query.value(0).toString(); int age = query.value(1).toInt(); qDebug() << name << age; } ``` 在上述代码中,my_table是您要查询的表的名称。使用query.next()方法遍历结果集,并使用query.value()方法获取每个列的值。 希望这可以帮助您开始使用Qt连接Oracle数据库
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值