基于开发者空间编写ODBC应用程序操作OpenGauss数据库

基于开发者空间编写ODBC应用程序操作OpenGauss数据库公司业务项目中大量商业数据需要高效管理 并进行读取 修改 写入 删除等操作 离不开数据库系统对业务数据的支持 鲲鹏通用计算增强型 kC2 4vCPUs 8G Open Euler 22 03 Server 定制版

大家好,欢迎来到IT知识分享网。

1 概述

1.1 背景介绍

公司业务项目中大量商业数据需要高效管理,并进行读取,修改,写入,删除等操作,离不开数据库系统对业务数据的支持。故在企业开发商业软件时,代码绕不开与数据库的关联。为了解决该问题,各数据库厂商提供了软件研发中针对不同开发语言的驱动。例如很多使用C语言研发的基础软件在使用不同的数据库时,各数据库都有对应的C语言驱动API,像Oracle的OCI,PostgreSQL的Libpq,MySQL的Connectore C等。但由于不同数据库厂商提供的专项C语言开发接口都不同,导致在商业软件开发时面对不同Database的驱动接口,需要开发对应数据库的接口代码,故增加了开发复杂性和可维护性,且对数据库的可移植性构成巨大挑战。

所以数据库厂商为解决跨数据库链接问题,提供了早期的嵌入式SQL API。但这些驱动库存在不规范导致的兼容性问题。为改善访问不同数据库,缺乏基于C语言的统一编程接口,1991年MicroSoft提出开放式数据库互连(
Open-DataBase-Connectivity)。在后面发展历程中,ODBC基于SAG的SQL CAE方案,具有强大的功能和灵活性,其包含标准的错误代码集,连接和登录数据库方法及数据类型表示等关键特性。故ODBC解决方案逐渐成为Windows, MacOS, Linux平台上的标准接口,并推动该方面的开放性和标准化。

通过实际操作,让大家深入了解如何利用云主机开发C程序应用,并操作和部署OpenGauss数据库。在这个过程中,大家将学习到从驱动安装、环境编码、函数应用到OpenGauss数据库部署以及与 ODBC API集成等一系列关键步骤,从而掌握 ODBC连接数据库的基本使用方法,体验其在应用开发中的优势。

1.2 适用对象

  • 企业
  • 个人开发者
  • 高校学生

1.3 案例时间

本案例总时长预计60分钟。

1.4 案例流程

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

1.5 资源总览

资源名称

规格

单价(元)

时长(分钟)

云主机

鲲鹏通用计算增强型 kC2 | 4vCPUs | 8G | Open Euler 22.03 Server定制版

免费

60

最新案例动态,请查阅 《基于开发者空间编写ODBC应用程序操作OpenGauss数据库》「链接」。小伙伴快来领取华为开发者空间,进入云开发环境桌面版实操吧!

2 ODBC驱动程序管理器适配

2.1 开发者空间配置

ODBC作为面向C语言连接与操作数据库的统一程序接口规范标准,应用程序通过ODBC提供的应用程序接口与数据库进行交互,增强了应用程序的可移植性、扩展性和可维护性。通过获取ODBC进行C调用OpenGauss编程。

首先直接进入开发者空间-华为云界面,点击进入桌面连接云主机。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

使用Ctrl + Alt + t打开Terminal终端窗口。输入命令:

sudo yum list unixODBC

查看当前云主机环境是否安装了ODBC驱动管理器(unixODBC即为Linux平台ODBC驱动管理器)。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

当前Available Packages显示unixODBC.aarch64,说明ODBC驱动管理器并没有安装,如果已安装,则显示在Installed Packages栏下面。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

安装命令如下:

sudo yum install -y unixODBC
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

如上图所示,即表示ODBC驱动管理器安装成功。

输入如下命令,安装unixODBC头文件及开发环境。

sudo yum install -y unixODBC-devel
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

2.2 下载OpenGaussDB-ODBC驱动程序

本案例中,使用OpenGauss的ODBC驱动程序源码,完成代码编译构建和部署的功能。

在浏览器中输入OpenGauss网址:
https://opengauss.org/zh/download/,进入开源项目opengauss软件包下载页面。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

在OpenGauss的首页右上方,点击登录,在弹出的对话框中输入自己的用户名和密码。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

查看云主机环境的CPU架构和OS系统版本信息。输入如下命令查看:

uname -a cat /etc/os-release
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

根据上面截图显示Linux developer
5.10.0-250.0.0.154.oe2203sp4.aarch64 #1 SMP,openEuler 22.03 (LTS-SP4)可知,本案例环境是AArch64架构和openEuler 22.03 LTS版本。

  1. 在软件包下载页面,往下拉找到openGauss Connectors栏,根据云主机当前环境选择对应架构 AArch64 和操作系统 openEuler 22.03 LTS 版本的ODBC驱动程序。
基于开发者空间编写ODBC应用程序操作OpenGauss数据库


下载地址如下:

https://opengauss.obs.cn-south-1.myhuaweicloud.com/7.0.0-RC1/openEuler22.03/arm/openGauss-ODBC-7.0.0-RC1-openEuler22.03-aarch64.tar.gz


  1. 创建ODBC驱动安装目录并下载openGauss-ODBC-7.0.0-RC1-openEuler22.03-aarch64.tar.gz驱动包。
sudo mkdir /opt/openGuass_ODBC sudo chown developer:developer /opt/openGuass_ODBC cd /opt/openGuass_ODBC wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/7.0.0-RC1/openEuler22.03/arm/openGauss-ODBC-7.0.0-RC1-openEuler22.03-aarch64.tar.gz ls
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

  1. 解压ODBC驱动包。
tar xvf openGauss-ODBC-7.0.0-RC1-openEuler22.03-aarch64.tar.gz ls ls lib/ ls odbc/lib/
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

2.3 适配ODBC驱动管理器unixODBC

根据2.1章节所示,云主机环境已经安装了驱动管理器unixODBC。其主要分为三大块:odbcinst、odbc_config和isql。

2.3.1 odbcinst

输入:

odbcinst --version
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbcinst -h
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

用如下命令查看当前系统驱动管理器的配置文件的位置。

odbcinst -j
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

注意:

由上图得知系统的数据库文件所有目录不存在,说明系统驱动管理器的数据源和驱动文件位置是错误的,此时在当前环境中设置环境变量(或者在当前用户目录下的.bash_profile文件里添加如下环境变量并使其生效)。

ODBCSYSINI + ODBCINSTIN = odbcinst.ini文件路径 + odbcinst.ini文件名

ODBCSYSINI + ODBCINI = odbc.ini文件路径 + odbc.ini文件名

export ODBCSYSINI=/etc export ODBCINSTINI=odbcinst.ini

通常不添加export ODBCINI=odbc.ini,因为设置了ODBCINI会影响当前用户的odbc.ini同系统odbc.ini处于相同的文件。正常环境应该要把系统的odbc.ini与用户的odbc.ini区分。
然后再执行如下命令,查看当前unixODBC驱动管理器的配置文件数据。

odbcinst -j
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

如图所示,当前用户的数据源是/home/developer/.odbc.ini,系统的数据源是/etc/odbc.ini。
打开当前驱动配置文件/etc/odbcinst.ini。

[openGauss] Description = ODBC for OpenGaussDB Driver = /opt/openGuass_ODBC/odbc/lib/psqlodbcw.so Setup = /opt/openGuass_ODBC/odbc/lib/psqlodbcw.so Driver64 = /opt/openGuass_ODBC/odbc/lib/psqlodbcw.so Setup = /opt/openGuass_ODBC/odbc/lib/psqlodbcw.so Setup64 = /opt/openGuass_ODBC/odbc/lib/psqlodbcw.so FileUsage = 1

执行如下命令:

vim /home/developer/.odbc.ini

添加如下内容,Servername=10.12.85.15是OpenGauss数据库的部署地址。请根据下面通配符X.X.X.X对照OpenGauss数据库自行修改。

[gauss_dsn] Driver=openGauss Servername=X.X.X.X Port=5432 Database=postgres Username=test Password=GaussDB@123 Trace=on TraceFile=/home/developer/odbc.log Debug=1 CommLog=1 SSLmode=disable

2.3.2 odbc_config

输入如下命令,可看到odbc_config所有参数。

odbc_config -h
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbc_config --prefix

参数prefix输出odbc的安装目录。

odbc_config --exec-prefix

参数exec-prefix输出odbc的安装目录。

odbc_config --include-prefix

参数include-prefix输出ODBC头文件目录。

odbc_config --lib-prefix

参数lib-prefix输出ODBC依赖库文件目录。

odbc_config --bin-prefix

参数bin-prefix输出ODBC可执行bin文件目录。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbc_config --version

参数version输出当前unixODBC驱动管理器版本号。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbc_config --libs

参数libs输出ODBC程序动态库(*.so文件)编译参数。

odbc_config --static-libs

参数static-libs输出ODBC程序静态库(*.a文件)目录。

odbc_config --libtool-libs

参数libtool-libs输出ODBC程序映射库文件(*.la静态与动态库映射文件)目录。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbc_config --cflags

参数cflags输出C编译器gcc的编译参数。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbc_config --odbcversion odbc_config --longodbcversion

参数输出对应的版本号。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbc_config --odbcini

参数odbcini输出odbc.ini配置文件所在位置。

odbc_config --odbcinstini

参数odbcinstini输出odbcinst.ini配置文件所在位置。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbc_config --header

参数header输出ODBC编译头文件内容。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

odbc_config --ulen

参数ulen输出ODBC中SQLULEN的长度数据。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

2.3.3 isql

isql --version
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

isql -h
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

注意

用unixODBC驱动管理器的isql工具连接openGauss数据库来测试。前提是已经安装部署了openGauss数据库,并且Gauss实例服务已经被启动。否则isql连接失败。

关于OpenGauss数据库的安装部署,请参照之前的案例,链接如下:

基于开发者空间部署OpenGauss主备集中式数据库系统「链接」

输入如下命令,使用isql工具通过ODBC直接登录OpenGauss数据库。

isql -v gauss_dsn
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

注意:

此处的gauss_dsn是对应odbc.ini里的[gauss_dsn],而odbc.ini配置文件里的Driver参数对应odbcinst.ini里的[openGauss]标签。

通过简单的SQL操作,如下:

create table test (id int, name varchar); select * from test; insert into test values(1, ’test’); insert into test values(100, ’GaussDB’); select * from test;
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

然后用OpenGauss客户端工具gsql登录检查isql中的数据写入是否在Gauss数据库中已经存储。

gsql -h 10.12.85.15 -U test -W GaussDB@123 -p 5432 -d postgres \d select * from test;
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

2.4 业务应用C程序研发中ODBC代码用例

下面是C语言程序开发中,调用ODBC API与openGauss数据库互连操作,包含建表(create table),插入(insert),修改(update),删除(delete)等基础操作。例如代码文件odbc-test.c。

#include <stdlib.h> #include <stdio.h> #include <sqlext.h> #ifdef WIN32 #include <windows.h> #endif SQLHENV V_OD_Env; SQLHSTMT V_OD_hstmt; SQLHDBC V_OD_hdbc; char typename[100]; SQLINTEGER value = 100; SQLINTEGER V_OD_erg, V_OD_buffer, V_OD_err, V_OD_id; int main(int argc,char *argv[]) { // 1. 申请环境句柄 V_OD_erg = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &V_OD_Env); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { printf("Error AllocHandle\n"); exit(0); } // 2. 设置环境属性(版本信息) SQLSetEnvAttr(V_OD_Env, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); // 3. 申请连接句柄 V_OD_erg = SQLAllocHandle(SQL_HANDLE_DBC, V_OD_Env, &V_OD_hdbc); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0); } // 4. 设置连接属性 SQLSetConnectAttr(V_OD_hdbc, SQL_ATTR_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_ON, 0); // 5. 连接数据源,这里的“userName”与“password”分别表示连接数据库的用户名和用户密码,请根据实际情况修改。 // 如果odbc.ini文件中已经配置了用户名密码,那么这里可以留空("");但是不建议这么做,因为一旦odbc.ini权限管理不善,将导致数据库用户密码泄露。 V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "DSN", SQL_NTS, (SQLCHAR*) "", SQL_NTS, (SQLCHAR*) "", SQL_NTS); if ((V_OD_erg != SQL_SUCCESS) && (V_OD_erg != SQL_SUCCESS_WITH_INFO)) { printf("Error SQLConnect %d\n", V_OD_erg); SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); exit(0); } printf("Connected !\n"); // 6. 设置语句属性 SQLSetStmtAttr(V_OD_hstmt, SQL_ATTR_QUERY_TIMEOUT, (SQLPOINTER *)3, 0); // 7. 申请语句句柄 SQLAllocHandle(SQL_HANDLE_STMT, V_OD_hdbc, &V_OD_hstmt); // 8. 直接执行SQL语句 SQLExecDirect(V_OD_hstmt, "drop table IF EXISTS customer_t1", SQL_NTS); SQLExecDirect(V_OD_hstmt, "CREATE TABLE customer_t1(c_customer_sk INTEGER, c_customer_name VARCHAR(32));", SQL_NTS); SQLExecDirect(V_OD_hstmt, "insert into customer_t1 values(25,'LiLei')", SQL_NTS); // 9. 准备执行 SQLPrepare(V_OD_hstmt, "insert into customer_t1 values(?)", SQL_NTS); // 10. 绑定参数 SQLBindParameter(V_OD_hstmt, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &value, 0, NULL); // 11. 执行准备好的语句 SQLExecute(V_OD_hstmt); SQLExecDirect(V_OD_hstmt, "select id from testtable", SQL_NTS); // 12. 获取结果集某一列的属性 SQLColAttribute(V_OD_hstmt, 1, SQL_DESC_TYPE, typename, 100, NULL, NULL); printf("SQLColAtrribute %s\n", typename); // 13. 绑定结果集 SQLBindCol(V_OD_hstmt, 1, SQL_C_SLONG, (SQLPOINTER)&V_OD_buffer, 150, (SQLLEN *)&V_OD_err); // 14. 通过SQLFetch取结果集中数据 V_OD_erg=SQLFetch(V_OD_hstmt); // 15. 通过SQLGetData获取并返回数据 while(V_OD_erg != SQL_NO_DATA) { SQLGetData(V_OD_hstmt, 1, SQL_C_SLONG, (SQLPOINTER)&V_OD_id, 0, NULL); printf("SQLGetData ----ID = %d\n", V_OD_id); V_OD_erg=SQLFetch(V_OD_hstmt); }; printf("Done !\n"); // 16. 断开数据源连接并释放句柄资源 SQLFreeHandle(SQL_HANDLE_STMT, V_OD_hstmt); SQLDisconnect(V_OD_hdbc); SQLFreeHandle(SQL_HANDLE_DBC, V_OD_hdbc); SQLFreeHandle(SQL_HANDLE_ENV, V_OD_Env); return 0; }

该程序用例,需要修改程序中的DSN,对应odbc.ini里的[gauss_dsn]。

V_OD_erg = SQLConnect(V_OD_hdbc, (SQLCHAR*) "DSN", SQL_NTS, (SQLCHAR*) "", SQL_NTS, (SQLCHAR*) "", SQL_NTS);
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

缺省一些常用ODBC API函数引用。如下:

SQLEndTran,SQLExtendedFetch,SQLGetConnectAttr,SQLGetCursorName,SQLGetDescField,SQLGetDescRec,SQLGetEnvAttr,SQLGetInfo,SQLRowCount,SQLPutData,SQLTablePrivileges,SQLTables,SQLSetPos。

用户如果对没有被引用的函数感兴趣,可自行参考3.1章节MicroSoft ODBC API官方链接,自己查询使用方法。

2.5 编译和测试方法

例如上面程序文件名为odbc-test.c。

在云主机上编译该文件生成可执行文件,命令如下:

gcc -o odbc-test odbc-test.c -L /opt/openGuass_ODBC/odbc/lib -lodbc

则会生成odbc-test可执行文件。

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

参数说明:

参数

说明

-L

指向程序odbc-test.c要依赖的动态库路径

-lodbc

表示gcc要依赖的动态库是odbc驱动库

执行程序,如下:

./odbc-test
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

用OpenGauss客户端工具gsql登录数据库:

gsql -h 10.12.85.15 -U test -W GaussDB@123 -p 5432 -d postgres \d select * from customer_t1;
基于开发者空间编写ODBC应用程序操作OpenGauss数据库

基于开发者空间编写ODBC应用程序操作OpenGauss数据库

经过gsql客户端登录数据库,可以看到后台数据库中已经存储了应用程序C代码中写入和修改的表数据。平时企业业务系统在开发中,如果用C程序编程去处理商业数据,则可借鉴2.4章节的C程序代码。

最经典的业务场景就是银行存钱取钱,业务系统程序先从银行数据库把对应用户的存款数额读取出来,等用户取完钱,把读取的数据(存款数额)进行update操作后为取款后剩余的钱数,再回写入银行数据库系统。

2.6 驱动调试说明

本案例为了缩减案例内容和篇幅,驱动管理器unixODBC直接用yum安装,不再用unixODBC源码编译。OpenGauss的驱动ODBC动态库也直接从官网下载驱动包,不再从gitee上git克隆ODBC源码,指定OpenGauss安装目录去编译驱动程序。故此种方案不支持ODBC驱动的调试,不方便观察驱动内部执行过程的观察,在面对实际项目中驱动的问题,无法直接调试。只该方案只适合做应用,不适合做研发。

3 参考资料

3.1 MicroSoft ODBC API参考

ODBC API 参考 – ODBC API Reference | Microsoft Learn:
https://learn.microsoft.com/zh-cn/sql/odbc/reference/syntax/odbc-api-reference?view=sql-server-ver16

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/186118.html

(0)
上一篇 2025-08-20 13:20
下一篇 2025-08-20 13:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信