odbc
window和linux都有odbc的中间件,可以通过odbc中间件配合qtsql连接数据库
- windows下配置odbc
- linux配置odbc
apt install unixodbc unixodbc-dev
/etc/odbcinst.ini配置
ini
[DM8 ODBC DRIVER]
Description=DM8 ODBC Driver
DRIVER=/opt/dmdbms/bin/libdodbc.so
/etc/odbc.ini配置
ini
[dm8]
Description=DM8 Database
DRIVER=DM8 ODBC DRIVER
SERVER=localhost
TCP_PORT=5236
UID=SYSDBA
PWD=SYSDBA
isql -v dm8测试连接是否成功
qt
使用qt6 构建项目
c
aux_source_directory(. code)
find_package(Qt6 COMPONENTS REQUIRED Core Sql Gui Widgets Network PATHS d:/tools/qt/6.6.0/msvc2019_64/lib/cmake)
add_executable(dameng ${code})
target_link_libraries(dameng Qt6::Core Qt6::Sql)
chatgpt提示的代码如下:
c
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QSqlError>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 添加数据库驱动
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
// 设置数据库文件路径
db.setDatabaseName("dm");
// 打开数据库
if (!db.open()) {
qDebug() << "Failed to open database:"<<db.lastError().text();
return -1;
}
// 创建查询对象
QSqlQuery query;
// 执行查询语句
if (!query.exec("SELECT * FROM \"SYS\".sysuser$")) {
qDebug() << "Query failed: " << query.lastError().text();
return -1;
}
QSqlRecord record = query.record();
// 遍历查询结果
while (query.next()) {
for (int i = 0; i < record.count(); ++i) {
qDebug() << record.fieldName(i) <<":"<< query.value(i).toString();
}
qDebug()<<"--------------------";
}
// 关闭数据库
db.close();
return a.exec();
}
exception
- no driver load
qtsql的driver在plugin的sqldriver目录里面,通过动态加载目录里面的文件加载driver
- 加密模块加载失败, HY000 QODBC: Unable to connect
达梦数据库bin文件中,拷贝ssleay32、libeay32两个文件
- isql 提示[ISQL]ERROR: Could not SQLConnect
检查/etc/odbc.ini中的配置是否正确,driver和odbcinst.ini的名称一致
- 提示libdodbc.so找不到
ldd libdodbc.so 是否有找不到的文件,需要配置环境变量LD_LIBRARY_PATH