PolarDB PostgreSQL版(兼容Oracle)提供了Unix版本和Windows版本的ODBC驱动,本文将介绍在不同系统中如何使用ODBC驱动。
前提条件
- 已经在PolarDB集群创建用户,如何创建用户请参见创建数据库账号。 
- 已经将需要访问PolarDB集群的主机IP地址添加到白名单,如何添加白名单请参见设置集群白名单。 
- Windows系统需要为Window 7以上版本,且已经安装了service pack 1。 
- Unix系统或Linux系统需要安装以下工具: - Libtool 1.5.10及以上版本。 
- unixODBC-devel。 
- PolarTools,下载及安装请参见PolarDB-Tools。 
 
下载驱动
- 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 3 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")   ;