PolarDB PostgreSQL版(兼容Oracle)提供了Unix版本和Windows版本的ODBC驱动,本文将介绍在不同系统中如何使用ODBC驱动。
前提条件
下载驱动
Unix或Linux系统x86架构32位驱动包:PolarDB-ODBC_Linux_X86_32.tar.gz
Unix或Linux系统x86架构64位驱动包:PolarDB-ODBC_Linux_X86_64.tar.gz
Unix或Linux系统ARM架构64位驱动包:PolarDB-ODBC_Linux_arm_64.tar.gz
Windows系统x86架构64位驱动包:PolarDB-ODBC_Windows_x86_64.7z
Windows系统x86架构32位驱动包:PolarDB-ODBC_Windows_x86_32.7z
Windows系统安装ODBC驱动
根据Windows操作系统的位数选择对应的安装包,下载地址请参见下载驱动。
下载完成后,解压ODBC包。
使用管理员身份运行
install.bat
文件,完成后按任意键退出即可。可选:如果您需要卸载ODBC包,运行
uninstall.bat
文件即可完成卸载。
Windows系统使用ODBC连接PolarDB
在控制面板中打开管理工具。
在管理工具页面,找到并运行ODBC数据源。
在ODBC数据源管理程序页面,单击添加。
选择POLARDB(UNICODE)作为数据源的驱动程序,单击完成。
在弹出的对话框中,输入以下信息。
参数
说明
Date Source
数据源名称。
Description
数据源的描述。
Datebase
目标数据库名称。
SSL Mode
选择SSL加密方式。
Server
目标数据库连接地址,PolarDB集群连接地址查看方式请参见查看或申请连接地址。
Prot
目标数据库的端口,默认为1521。
User Name
数据库账号。
Password
数据库账号的密码。
单击Save即可。
Unix或Linux系统安装ODBC驱动
执行以下命令,设置环境变量LD_LIBRARY_PATH的路径指向。
export LD_LIBRARY_PATH=<PolarDB-ODBC/lib/path>
执行以下命令,设置环境变量ODBCINI的路径指向。
export ODBCINI=</your odbc.init file path>
根据操作系统的架构和版本下载对应的ODBC驱动,下载地址请参见下载驱动。
安装ODBC驱动。
说明PolarDB提供的ODBC驱动压缩包无需安装,解压后即可使用。解压命令如下所示:
tar -zxvf polardb-odbc.tar.gz
其目录结果如下所示:
├── include ├── lib └── samples 6 directories
Uinx或Linux系统使用ODBC连接PolarDB
在Linux服务器上安装的Libtool,Libtool需要是1.5.1以上版本。
yum install -y libtool
在Linux服务器上安装unixODBC-devel。
yum install -y unixODBC-devel
编辑您配置的
odbc.ini
文件。vim $ODBCINI
在
odbc.ini
文件中添加如下信息。[POLARDB] Description = ODBC for POLARDB Driver = /home/user/target/lib/unix/polardb-odbc.so Driver64 = /home/user/target/lib/unix/polardb-odbc.so Database = <数据库名称> Servername = <数据库连接地址> Password = <密码> Port = <端口> Username = <用户名> Trace = yes TraceFile = /tmp/odbc.log FileUsage = 1
说明PolarDB集群连接地址查看方式请参见查看或申请连接地址。
示例中/home/user路径需替换为
target
文件夹所在实际路径。
连接PolarDB。
$isql -v POLARDB +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL>
Unix或Linux系统操作示例
以下内容将为您介绍如何运行Test1
和Test2
测试文件。
请提前在PolarDB数据库中创建以下表结构并插入数据:
create table emp(empno number(4),
ename varchar2(10),
job varchar2(9),
mgr number (4),
hiredate date,
sal number(7,2),
comm number(7,2),
deptno number(2));
insert into emp values(7369,'smith','clerk',7902 ,to_date('17-12-1980','dd-mm-yyyy'),800,null, 20 );
insert into emp values(7499,'allen','salesman',7698 ,to_date('20-2-1981','dd-mm-yyyy'),1600, 300 , 30 );
insert into emp values(7521,'ward' ,'salesman' ,7698 ,to_date(' 22-2-1981' , 'dd-mm-yyyy' ), 1250 , 500 , 30 );
insert into emp values(7566,'jones','manager' , 7839 ,to_date(' 2-4-1981' , 'dd-mm-yyyy' ), 2975 , null , 20 );
insert into emp values(7654,'martin','salesman',7698 ,to_date(' 28-9-1981' , 'dd-mm-yyyy' ), 1250 , 1400 , 30 );
insert into emp values(7698,'blake','manager', 7839 ,to_date(' 1-5-1981' , 'dd-mm-yyyy' ), 2850 , null , 30 );
insert into emp values(7782,'clark','manager', 7839 ,to_date(' 9-6-1981' , 'dd-mm-yyyy' ), 2450 , null , 10 );
insert into emp values(7788,'scott','analyst', 7566 ,to_date(' 13-7-1987' , 'dd-mm-rr ' ) - 85 , 3000 , null , 20 );
insert into emp values(7839,'king', 'president ' , null ,to_date('17-11-1981 ' , 'dd-mm-yyyy' ), 5000 , null , 10 );
insert into emp values(7844,'turner','salesman ' , 7698 ,to_date('8-9-1981 ' , 'dd-mm-yyyy' ), 1500 , 0 , 30 );
insert into emp values(7876,'adams', 'clerk' , 7788 ,to_date('13-7-1987' , 'dd-mm-rr ' ) - 51 , 1100 , null , 20 );
insert into emp values(7900,'james', 'clerk' , 7698 ,to_date('3-12-1981' , 'dd-mm-yyyy' ), 950 , null , 30 );
insert into emp values(7902,'ford', 'analyst' , 7566 ,to_date('3-12-1981' , 'dd-mm-yyyy' ), 3000 , null , 20 );
insert into emp values(7934,'miller','clerk ' , 7782 ,to_date('23-1-1982' , 'dd-mm-yyyy' ), 1300 , null , 10 );
执行以下命令,解压ODBC驱动压缩包。
tar -zxvf polardb-odbc.tar.gz
执行以下命令,打开
polardb-odbc
文件夹。cd polardb-odbc
打开ODBC驱动文件夹中的
samples
文件夹。cd samples
对测试样例进行编译,完成编译后会得到
Test1
和Test2
两个测试文件。make
运行
Test1
和Test2
。./Test1 ## 运行Test1 ./Test2 ## 运行Test2
说明Test1
为增删改查示例;Test2
为游标和out参数示例。以下代码示例仅为部分代码,完整代码示例请查看驱动包中的
samples
文件夹中的Test1
和Test2
测试文件。
Test1示例如下所示:
...
int main(int argc, char* argv[])
{
/*初始化*/
RETCODE rCode;
HENV *hEnv = (HENV*)malloc(sizeof(HENV));
HDBC *hDBC = (HDBC*)malloc(sizeof(HDBC));
HSTMT *hStmt = (HSTMT*)malloc(sizeof(HSTMT));
Connect("POLARDB","user","",&hEnv,&hDBC);
rCode = SQLAllocStmt(*hDBC,hStmt);
rCode = SQLAllocHandle(SQL_HANDLE_STMT,*hDBC,hStmt);
/*增删改查*/
ExecuteInsertStatement(&hStmt,(UCHAR*) "INSERT INTO EMP(EMPNO,ENAME) VALUES((SELECT COUNT(EMPNO) FROM EMP),'JACKSON')");
ExecuteUpdate(&hStmt,(UCHAR*) "UPDATE EMP SET ENAME='ODBC Test' WHERE EMPNO < 100");
ExecuteDeletStatement(&hStmt,(UCHAR*) "DELETE FROM EMP WHERE EMPNO<100");
ExecuteSimple_Select(&hStmt,(UCHAR*) "SELECT EMPNO,ENAME,JOB,MGR,HIREDATE FROM EMP where empno = 7369");
/*关闭连接*/
Disconnect(&hEnv,&hDBC,&hStmt);
/*clean up*/
free(hEnv);
free(hDBC);
free(hStmt);
return 0;
}
Test2示例如下所示:
int main(int argc, char* argv[])
{
/* 定义*/
RETCODE rCode;
SQLUSMALLINT a;
SQLINTEGER Num1IndOrLen;
SQLSMALLINT iTotCols = 0;
int j;
SDWORD cbData;
/*初始化*/
HENV *hEnv = (HENV*)malloc(sizeof(HENV));
HDBC *hDBC = (HDBC*)malloc(sizeof(HDBC));
HSTMT *hStmt = (HSTMT*)malloc(sizeof(HSTMT));
HSTMT *hStmt1 = (HSTMT*)malloc(sizeof(HSTMT));
/*建立连接*/
Connect("POLARDB","user","***",&hEnv,&hDBC);
rCode = SQLAllocStmt(*hDBC,hStmt);
rCode = SQLAllocStmt(*hDBC,hStmt1);
rCode = SQLAllocHandle(SQL_HANDLE_STMT,*hDBC,hStmt);
rCode = SQLAllocHandle(SQL_HANDLE_STMT,*hDBC,hStmt1);
/*begin*/
ExecuteSimple_Select(&hStmt1,(UCHAR*) "BEGIN;");
/*prepare*/
RETCODE rc = SQLPrepare((*hStmt),(SQLCHAR*)"{ call refcur_inout_callee2(?,?)}",SQL_NTS);
rc = SQLBindParameter((*hStmt),1, SQL_PARAM_INPUT_OUTPUT, SQL_C_CHAR,SQL_REFCURSOR,0, 31,
strName, 31, &Num1IndOrLen);
rc = SQLBindParameter((*hStmt),2, SQL_PARAM_INPUT_OUTPUT, SQL_C_CHAR,SQL_REFCURSOR,0, 31,
&strName1, 31, &Num1IndOrLen);
Num1IndOrLen=0;
/*execute*/
rc = SQLExecute((*hStmt));
if(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
printf("\nstrName _________ = %s\n",strName);
printf("\nstrName 1_________ = %s\n",strName1);
}
printf("\n First Cursor as OUT Parameter \n") ;