PolarDB-O提供了Unix版本和Windows版本的ODBC驱动,本文将介绍在不同系统中如何使用ODBC驱动。

前提条件

  • 已经在PolarDB集群创建用户,如何创建用户请参见创建数据库账号
  • 已经将需要访问PolarDB集群的主机IP地址添加到白名单,如何添加白名单请参见设置集群白名单
  • Windows系统需要为Window 7及以上版本,且已经安装了Windows7 service pack 1。
  • Unix系统或Linux系统需要安装以下工具:
    • Libtool 1.5.10及以上版本
    • unixODBC-devel
    • libpq

下载驱动

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. 在弹出的对话框中,输入以下信息。
    WIN ODBC登录信息
    参数 说明
    Date Source 数据源名称。
    Description 数据源的描述。
    Datebase 目标数据库名称。
    SSL Mode 选择SSL加密方式。
    Server 目标数据库连接地址,PolarDB集群连接地址查看方式请参见查看连接地址
    Prot 目标数据库的端口,默认为1521。
    User Name 数据库账号。
    Password 数据库账号的密码。
  6. 单击Save即可。

Unix或Linux系统安装ODBC驱动

  1. 根据操作系统的架构和版本下载对应的ODBC驱动,下载地址请参见下载驱动
  2. 安装ODBC驱动。
    说明 PolarDB提供的ODBC驱动压缩包无需安装,解压后即可使用。解压命令如下所示:
    tar -zxvf polardb_oracle_odbc.tar.gz

Uinx或Linux系统使用ODBC连接PolarDB

  1. 在Linux服务器上安装的Libtool,Libtool需要是1.5.1以上版本。
    yum install -y 
  2. 在Linux服务器上安装unixODBC-devel。
    yum install -y unixODBC-devel
  3. 编辑/etc目录中odbcinst.ini文件。
    vim /etc/odbcinst.ini
  4. odbcinst.ini文件中添加如下信息。
    [POLARDB]
    Description = ODBC for POLARDB
    Driver      = /root/target/lib/unix/polar-odbc.so
    Setup       = /root/target/lib/unix/libodbcpolarS.so
    Driver64    = /root/target/lib/unix/polar-odbc.so
    Setup64     = /root/target/lib/unix/libodbcpolarS.so
    Database    = <数据库名称>
    Servername  = <数据库连接地址>
    Password    = <密码>
    Port        = <端口>
    Username    = <用户名>
    Trace       = yes
    TraceFile   = /tmp/odbc.log
    FileUsage   = 1
    说明
    • PolarDB集群连接地址查看方式请参见查看连接地址
    • 示例中/root路径请替换成target文件夹所在实际路径。
  5. 连接PolarDB。
    $isql -v POLARDB
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    SQL>

Unix或Linux系统操作示例

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

  1. 打开ODBC驱动文件夹中的samples文件夹。
    cd samples
  2. 对测试样例进行编译,完成编译后会得到Test1Test2两个测试文件。
    make
  3. 运行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")   ;