ODBC

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,下载及安装请参见概述

下载驱动

Windows系统安装ODBC驱动

  1. 根据Windows操作系统的位数选择对应的安装包,下载地址请参见下载驱动

  2. 下载完成后,解压ODBC包。

  3. 使用管理员身份运行install.bat文件,完成后按任意键退出即可。

    WIN安装ODBC
  4. 可选:如果您需要卸载ODBC包,运行uninstall.bat文件即可完成卸载。

Windows系统使用ODBC连接PolarDB

  1. 控制面板中打开管理工具

  2. 管理工具页面,找到并运行ODBC数据源

  3. ODBC数据源管理程序页面,单击添加

  4. 选择POLARDB(UNICODE)作为数据源的驱动程序,单击完成

    WIN ODBC选中数据源
  5. 在弹出的对话框中,输入以下信息。

    参数

    说明

    Date Source

    数据源名称。

    Description

    数据源的描述。

    Datebase

    目标数据库名称。

    SSL Mode

    选择SSL加密方式。

    Server

    目标数据库连接地址,PolarDB集群连接地址查看方式请参见查看或申请连接地址

    Prot

    目标数据库的端口,默认为1521。

    User Name

    数据库账号。

    Password

    数据库账号的密码。

  6. 单击Save即可。

Unix或Linux系统安装ODBC驱动

  1. 执行以下命令,设置环境变量LD_LIBRARY_PATH的路径指向。

    export LD_LIBRARY_PATH=<PolarDB-ODBC/lib/path>
  2. 执行以下命令,设置环境变量ODBCINI的路径指向。

    export ODBCINI=</your odbc.init file path>
  3. 根据操作系统的架构和版本下载对应的ODBC驱动,下载地址请参见下载驱动

  4. 安装ODBC驱动。

    说明

    PolarDB提供的ODBC驱动压缩包无需安装,解压后即可使用。解压命令如下所示:

    tar -zxvf polardb-odbc.tar.gz

    其目录结果如下所示:

    ├── include
    ├── lib
    └── samples
    
    6 directories

Uinx或Linux系统使用ODBC连接PolarDB

  1. 在Linux服务器上安装的Libtool,Libtool需要是1.5.1以上版本。

    yum install -y libtool
  2. 在Linux服务器上安装unixODBC-devel。

    yum install -y unixODBC-devel
  3. 编辑您配置的odbc.ini文件。

    vim $ODBCINI 
  4. 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文件夹所在实际路径。

  5. 连接PolarDB。

    $isql -v POLARDB
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    SQL>

Unix或Linux系统操作示例

以下内容将为您介绍如何运行Test1Test2测试文件。

请提前在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 );
  1. 执行以下命令,解压ODBC驱动压缩包。

    tar -zxvf polardb-odbc.tar.gz
  2. 执行以下命令,打开polardb-odbc文件夹。

    cd polardb-odbc
  3. 打开ODBC驱动文件夹中的samples文件夹。

    cd samples
  4. 对测试样例进行编译,完成编译后会得到Test1Test2两个测试文件。

    make
  5. 运行Test1Test2

    ./Test1
    ## 运行Test1
    
    ./Test2
    ## 运行Test2
    说明
    • Test1为增删改查示例;Test2为游标和out参数示例。

    • 以下代码示例仅为部分代码,完整代码示例请查看驱动包中的samples文件夹中的Test1Test2测试文件。

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")   ;