体验GaussDB数据库应用程序ODBC接口实验【华为云GaussDB:与数据库同行的日子】

举报
gentle_zhou 发表于 2023/12/16 23:55:48 2023/12/16
【摘要】 本文用于体验GaussDB其中的一种:ODBC接口,并能够掌握使用程序通过支持的接口访问数据库。

实验背景

GaussDB作为华为自主研发的一款企业级分布式关系型数据库,具备PB级海量数据存储能力和企业级高可靠能力,也是国内首款纯软全密态数据库,支持国密算法、透明加密,并提供国内首个双集群强一致方案。

这么优秀的一款数据库服务,了解并熟悉如何使用其常用接口及基本配置操作就显得尤为重要了。而用于连接数据库的接口,JDBC、ODBC和Psycopg就是其中最为常见的3种。本文用于体验GaussDB其中的一种:ODBC接口,并能够掌握使用程序通过支持的接口访问数据库。

ODBC接口

ODBC,全称是Open Database Connectivity,它是一种用于执行SQL语句的通用API,它可以为不同类型的数据库提供统一访问接口。应用程序可以基于它进行数据操作。

ODBC的优势是可以跨语言使用,支持多种编程语言,如C、C++、Python等,灵活性高,性能好。

介绍完ODBC接口,接下来就是本文重点:体验GaussDB数据库应用程序ODBC接口实验了。

环境准备 和 实验配置

具体的步骤和措施,可以查看第一篇《体验GaussDB数据库应用程序JDBC接口实验【华为云GaussDB:与数据库同行的日子】》。

掌握ODBC的使用

1、加载驱动,连接数据库

通过在本地命令行内输入命令,获取unixODBC源码包:

yum install -y libtool
yum install -y libtool-ltdl-devel
yum install -y openssl-devel

wget https://udomain.dl.sourceforge.net/project/unixodbc/unixODBC/2.3.7/unixODBC-2.3.7pre.tar.gz

2、是安装unixODBC源码包

接着就是安装unixODBC源码包。如果机器上已经安装了其他版本的unixODBC,可以直接覆盖安装。
tar zxvf unixODBC-2.3.7pre.tar.gz
cd unixODBC-2.3.7pre

然后是修改configure文件,找到LIB_VERSION,将它的值修改为"1:0:0",这样将编译出*.so.1的动态库,与psqlodbcw.so的依赖关系相同:vim configure;并且将LIB_VERSION="2:0:0"修改为LIB_VERSION=“1:0:0”。

再用如下命令进行编译

./configure --enable-gui=no   
make

使用root用户进行安装make install

3、替换客户端GaussDB驱动程序

将GaussDB-Kernel-VxxxRxxxCxx-xxxxx-64bit-Odbc.tar.gz解压。解压后会得到两个文件夹:lib与odbc,在odbc文件夹中还会有一个lib文件夹。将解压后得到的/lib文件夹与/odbc/lib文件夹中的所有动态库都拷贝到“/usr/local/lib”目录下。

cd /root
wget https://sandbox-expriment-files.obs.cn-north-1.myhuaweicloud.com/2434/GaussDB-Kernel-V500R002C10-EULER-64bit-Odbc.tar.gz
tar zxvf GaussDB-Kernel-V500R002C10-EULER-64bit-Odbc.tar.gz
cd /root/lib/
cp * /usr/local/lib
cd /root/odbc/lib/
cp * /usr/local/lib

4、配置数据源

使用vi命令,在“/usr/local/etc/odbcinst.ini”文件中追加以下内容:

[GaussMPP]
Driver64=/usr/local/lib/psqlodbcw.so
setup=/usr/local/lib/psqlodbcw.so

使用vi命令,在“/usr/local/etc/odbc.ini”文件中追加以下内容(其中IP需要进行更换为实际IP,用户名、密码和数据库可以继续沿用JDBC实验中的信息):

[MPPODBC]
Driver=GaussMPP
Servername=192.168.0.72
Database=demo
Username=db_dev
Password=Huawei123#$
Port=8000

5、配置环境变量

使用vim ~/.bashrc,在.bashrc文件中追加以下内容:

export LD_LIBRARY_PATH=/usr/local/lib/:$LD_LIBRARY_PATH
export ODBCSYSINI=/usr/local/etc
export ODBCINI=/usr/local/etc/odbc.ini

6、生效环境变量

用如下命令source ~/.bashrc来生效环境变量。

7、测试数据源

用如下命令isql -v MPPODBC来测试数据源。

回显为以下内容,表示测试成功。成功后可以使用命令"quit"或者"ctrl+c"回到系统页面。
image.png

执行SQL语句

用如下命令创建/opt/odbc/db/basic目录,并在目录下创建DBtest.c文件。

mkdir -p /opt/odbc/db/basic
cd /opt/odbc/db/basic
touch DBtest.c

使用vi命令vi DBtest.c,将以下代码添加进DBtest.c文件中:

// 此示例演示如何通过ODBC方式获取GaussDB中的数据。
// DBtest.c (compile with: libodbc.so)   
#include <stdlib.h> 
#include <stdio.h> 
#include <sqlext.h>
#ifdef WIN32
#include <windows.h>
#endif 
SQLHENV       V_OD_Env;        // Handle ODBC environment 
SQLHSTMT      V_OD_hstmt;      // Handle statement 
SQLHDBC       V_OD_hdbc;       // Handle connection     
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*) "MPPODBC", 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);
 }

使用gcc编译程序:gcc -lodbc -g DBtest.c -o DBtest

执行DBtest程序./DBtest,回显为Done!
image.png

验证数据,使用isql登录数据库,并执行sql:

isql -v MPPODBC
select * from customer_t1;
quit

回显有数据,表示程序创建表并插入数据成功。
image.png

征文活动

我正在参加【有奖征文 第28期】华为云GaussDB:与数据库同行的日子!
链接:https://bbs.huaweicloud.com/blogs/415547

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。