体验GaussDB数据库应用程序ODBC接口实验【华为云GaussDB:与数据库同行的日子】
实验背景
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"回到系统页面。
执行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!
验证数据,使用isql登录数据库,并执行sql:
isql -v MPPODBC
select * from customer_t1;
quit
回显有数据,表示程序创建表并插入数据成功。
征文活动
我正在参加【有奖征文 第28期】华为云GaussDB:与数据库同行的日子!
链接:https://bbs.huaweicloud.com/blogs/415547
- 点赞
- 收藏
- 关注作者
评论(0)