全部產品
Search
文件中心

PolarDB:ODBC

更新時間:Jul 06, 2024

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)作為資料來源的驅動程式,單擊完成

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