Linux Qt连接达梦数据库

本文详细介绍了在Linux麒麟V10系统上使用Qt与达梦数据库的连接过程,包括UnixODBC的编译配置、QODBC的自定义编译和Qt中数据库操作的步骤,适合开发者遇到类似问题时参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近因为工作需要,需要使用Qt连接达梦数据库,在Linux上比较麻烦,首先需要自己编译UnixODBC和Qt的QODBC库,其次还有各种环境配置。这里在安装好后记录一下,以后找起来方便。

        先说下我的电脑是麒麟V10系统+飞腾的CPU,Qt的版本是5.9.9,编译Qt的源码的文章可以看我的另一篇文章:银河麒麟V10 + 飞腾CPU编译安装 Qt5.9.9_Sakuya__的博客-优快云博客_中标麒麟安装qt5.9


ODBC的安装和配置

        官网下载UnixODBC:unixODBC

        解压下载的压缩包:

tar -zxvf unixODBC-2.3.11.tar.gz

        配置configure文件,通过--prefix设置安装的目录:

cd unixODBC-2.3.11/
./configure –prefix /usr/local

        编译:

Make

        安装:

Make install

         安装完后会在安装目录下的etc目录中生成odbc.ini odbcinst.ini两个配置文件,可以使用下面的命令查看配置文件的路径:

odbcinst -j

        如果查看的配置文件的路径和实际所在的路径不同的话,需要重新配置ODBCINIODBCSYSINI两个环境变量,使用命令:

export ODBCINI=/usr/local/etc/odbc.ini
export ODBCSYSINI=/usr/local/etc

        执行这两个命令只是临时设置了路径,重启电脑时还需要再设置一遍,想要永久设置,修改/etc/profile文件,把这两行加到文件末尾,然后执行source /etc/profile使设置生效。

        修改驱动信息,/usr/local/etc/odbcinst.ini做如下修改:

[DM8 ODBC DRIVER]

Description = ODBC DRIVER FOR DM8

Driver=/usr/local/DM8/bin/libdodbc.so

        /usr/local/etc/odbc.ini做如下修改 

[DM8]

Description = DM ODBC DSN

Driver = DM8 ODBC DRIVER

SERVER = localhost

UID = SYSDBA

PWD = SYSDBA

TCP_PORT= 5236

        这里红色标出的几个地方需要一样,最好设置成和你的数据库名一样,否则在Qt连接数据库的时候会因为数据库名不对报错。

        修改好后,可以使用下面的命令测试是否能连接成功,下图是连接成功的提示:

isql dm8 -v

        如果出现下面的报错,说找不到libdodbc.so,是因为libdodbc.so依赖的库文件没找到,可以把/usr/local/DM8/bin下的libdmdpi.so和libdmfldr.so这两个libdodbc.so依赖的库复制到/usr/lib

        如果报错不能加载libodbcinst.so,可以把/usr/local/lib下的libodbcinst.so复制到/usr/lib目录下

        上面这两个问题,实质上都是因为环境变量的路径里找不到这几个库文件,所以也可以通过设置/usr/local/DM8/bin和/usr/local/lib为环境变量的方法,以确保可以找到这几个库。


 编译QODBC

        在Linux系统中,由于没有自带ODBC驱动,所以编译Qt源码时,也不会自动编译QODBC,需要自己包含上UnixODBC的头文件然后编译,再把libqsqlodbc.so拷贝到Qt的路径下。没有这个库的话,在调用QSqlDatabase::addDatabase("QODBC")的时候会报错,告诉你缺少QODBC驱动。

        首先进入Qt的源码路径下的qtbase/src/plugins/sqldrivers,修改里面的qsqldriverbase.pri文件,修改include的路径为下图中的路径:

         再进入Qt的源码路径下的qtbase/src/plugins/sqldrivers/odbc,修改里面的odbc.pro文件,注释掉里面的QMAKE_USE += odbc

         然后进入Qt的安装目录下的bin目录,也就是你的qmake所在的目录,执行:

/usr/local/Qt-5.9.9/bin/qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lodbc" /home/kd1/Qt_Source/qt-everywhere-opensource-src-5.9.9/qtbase/src/plugins/sqldrivers/odbc/odbc.pro

        如果编译时报如下错误:

cannot write cache file /home/lh/qtexample/qt-5.13.0/gui/analogclock/.qmake.stash: permission denied

        说明文件夹权限是加密的,你需要修改其权限:进入项目对应的文件夹,修改其文件和子文件的权限为可读可写可执行:

sudo chmod 777  *  -R

        执行完qmake的命令后,会在qmake的路径下生成一个MakeFile文件,在qmake路径下执行make即可。默认编译好生成的libqsqlodbc.so文件会放在/plugins/sqldrives下,然后我们把它复制或移动到Qt安装目录下的plugins/sqldrives下就可以了,执行命令:

mv -f /plugins/sqldrives/libqsqlodbc.so /usr/local/Qt-5.9.9/plugins/sqldrives

        到这里就算是编译完成QODBC了。


Qt连接达梦数据库

   首先先要在pro文件中加入:

QT += sql

        连接数据库:

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("localhost");
db.setPort(5236);
db.setDatabaseName("DM8");            //这里数据库名要设置成上面配置文件中的红色字体
db.setUserName("SYSDBA");
db.setPassword("SYSDBA");
if (db.open())
{
    qDebug() << "connect ok!";
}
else
{
    qDebug() << "connect fail! " << db.lastError().text();
}

        在Qt连接数据库时,如果出现报错:

[Driver Manager] Data source name not found and no default driver specified QODBC3: Unable to connect

        说明setDatabaseName数据库名设置的不对,这里的数据库名不是你要连接的数据库名,而是DSN名。DSN名就是上面配置文件中我标记出来的红色字体,检查odbc.ini和odbcinst.ini中的配置。

         清空表,初始化测试环境:

QSqlQuery query;

QString strsql = "delete from PRODUCTION.PRODUCT_CATEGORY";
if(query.exec(strsql))
{
    qDebug() << "delete ok!";
}
else
{
    qDebug() << "delete fail! " << query.lastError().text();
}
query.clear();

        插入数据:

QSqlQuery query;

QString strsql = "insert into PRODUCTION.PRODUCT_CATEGORY(NAME) values('语文'), ('数学'), ('英语'), ('体育')";
if (query.exec(strsql))
{
    qDebug() << "insert ok!";
}
else
{
    qDebug() << "insert fail! " << query.lastError().text();
}
query.clear();

        删除数据:

QSqlQuery query;

QString strsql = "delete from PRODUCTION.PRODUCT_CATEGORY where name='数学'";
if (query.exec(strsql))
{
    qDebug() << "delete ok!";
}
else
{
    qDebug() << "delete fail! " << query.lastError().text();
}
query.clear();

        更新数据:

QSqlQuery query;

QString strsql = "update PRODUCTION.PRODUCT_CATEGORY set name = '英语—新课标' where name='英语';";
if (query.exec(strsql))
{
    qDebug() << "update ok!";
}
else
{
    qDebug() << "update fail! " << query.lastError().text();
}
query.clear();

        查询数据:

QSqlQuery query;

QString strsql = "select name from PRODUCTION.PRODUCT_CATEGORY";
if (query.exec(strsql))
{
    qDebug() << "select ok!";
}
else
{
    qDebug() << "select fail! " << query.lastError().text();
}
while (query.next())
{
    qDebug() << query.value(0).toString().toStdString().c_str();
}
query.clear();

### Linux系统中使用C++连接达梦数据库的解决方案 #### 安装达梦数据库客户端 为了能够在Linux环境中使用C++访问达梦数据库,首先需要安装达梦数据库的客户端工具包。通常情况下,可以从官方渠道获取适用于Linux系统的DMCLient软件包,并按照说明完成安装。 ```bash sudo dpkg -i DMClient_*.deb ``` 确保安装过程中正确设置了环境变量以便于后续开发工作顺利开展[^1]。 #### 设置环境变量 在`.bashrc`或其他合适的shell初始化脚本里加入如下内容以使系统能找到必要的动态链接库及相关头文件: ```bash export LD_LIBRARY_PATH=/dm7/install/path/lib:$LD_LIBRARY_PATH export C_INCLUDE_PATH=/dm7/install/path/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/dm7/install/path/include:$CPLUS_INCLUDE_PATH source ~/.bashrc ``` 替换其中`/dm7/install/path/`为你实际解压或安装的位置目录路径[^1]。 #### 编写简单的C++示例程序 下面给出一段基本的例子用来演示如何利用ODBC接口从C++应用程序内部查询达梦数据库中的数据表记录数等功能特性。 ```cpp #include <sql.h> #include <sqlext.h> #include <stdio.h> int main() { SQLHENV env; SQLHDBC dbc; SQLHSTMT stmt; // Allocate environment handle. SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env); // Set the ODBC version to 3.x. SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); // Allocate connection handle. SQLAllocHandle(SQL_HANDLE_DBC, env, &dbc); // Connect to data source. const char* dsn = "YourDSN"; const char* user = "your_user"; const char* pass = "your_pass"; SQLConnect(dbc, (SQLCHAR *)dsn, SQL_NTS, (SQLCHAR *)user, SQL_NTS, (SQLCHAR *)pass, SQL_NTS); // Prepare and execute statement. SQLAllocHandle(SQL_HANDLE_STMT, dbc, &stmt); SQLRETURN ret = SQLExecDirect(stmt, (SQLCHAR*)"SELECT COUNT(*) FROM test_table", SQL_NTS); if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) { printf("Query executed successfully.\n"); // Fetch result set metadata. short column_count; SQLNumResultCols(stmt, &column_count); // Bind columns. int count_value; SQLBindCol(stmt, 1, SQL_C_LONG, &count_value, sizeof(count_value), NULL); // Fetch row values. while (SQLFetch(stmt) == SQL_SUCCESS){ printf("Row Count: %d\n", count_value); } } else { printf("Error executing query."); } // Clean up resources. SQLFreeHandle(SQL_HANDLE_STMT, stmt); SQLDisconnect(dbc); SQLFreeHandle(SQL_HANDLE_DBC, dbc); SQLFreeHandle(SQL_HANDLE_ENV, env); return 0; } ``` 此代码片段展示了怎样通过标准ODBC API调用序列来建立同远程服务器之间的通信链路并检索特定关系型表格内的条目总数信息[^1]。 #### 构建项目 假设保存上面源码至名为demo.cpp文件当中,则可通过g++编译器加上-lodbc选项将其连结成可执行档形式: ```bash g++ demo.cpp -o demo -lodbc ``` 运行生成好的二进制文件之前记得再次核实所有必需项均已妥善安置到位无误之后再继续下一步骤操作即可正常使用该功能模块了! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值