文档下载建议反馈入口

  • Windows 系统
  • Linux 系统
  • 支持的 ODBC 接口

PostgreSQL ODBC 连接 KWDB 数据库

开放数据库连接(Open Database Connectivity,ODBC)是一种应用程序编程接口(Application Programming Interface,API),为应用程序访问数据库存储的信息提供了一种标准。ODBC 为异构数据库访问提供统一接口,实现异构数据库间的数据共享。使用 ODBC API 的应用程序可以访问任何符合 ODBC 标准的数据库中的数据,通常无需修改应用程序代码。

本文介绍如何使用 PostgreSQL ODBC 连接 KWDB 数据库。

Windows 系统

前提条件

安装 PostgreSQL ODBC 驱动

  1. 解压缩 PostgreSQL ODBC 驱动安装包。
  2. 双击运行 psqlodbc-setup.exe 应用程序,按照提示安装 PostgreSQL ODBC 驱动。

配置 ODBC 数据源

  1. 单击开始,然后选择 控制面板 > 系统和安全 > 管理工具,打开管理工具窗口。

  2. 管理工具窗口,双击 ODBC 数据源(64位),打开 ODBC 数据源管理程序窗口。

  3. ODBC 数据源管理程序窗口,选择用户 DSN 页签,然后单击添加

  4. 创建新数据源窗口,选择 PostgreSQL ANSI(x64),然后单击完成

  5. 配置数据源。

    • Data Source:数据源名称。
    • Description:可选项,数据源描述信息。
    • Database:KWDB 数据库的名称。
    • SSL Mode:是否开启 SSL 加密模式。默认情况下,不开启 SSL 加密模式。
    • Server:KWDB 数据库的 IP 地址。
    • Port:KWDB 数据库的连接端口。
    • User Name:连接数据库的用户名。
    • Password:身份验证时使用的密码。安全模式下,优先使用 SSL 证书进行登录认证。
  6. (可选)验证配置是否正确。

    单击 Test。如果出现 Connection successful,说明配置正确。

  7. 单击 Save,保存配置信息。

  8. 单击确定

连接示例

以下示例说明如何根据配置的数据源连接 KWDB 数据库并查询数据。

#include <windows.h>
#include <sql.h>
#include <sqlext.h>
#include <stdio.h>

int main() {
    SQLHENV hEnv = NULL;
    SQLHDBC hDbc = NULL;
    SQLHSTMT hStmt = NULL;
    SQLRETURN retcode;
    SQLLEN id;
    SQLCHAR menuID[32];
    SQLCHAR menuName[128];

    // 分配环境句柄
    SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
    // 设置环境属性
    SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
    // 分配连接句柄
    SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
    // 连接数据库
    SQLRETURN ret;
    ret = SQLConnect(hDbc, (SQLCHAR*)"kwdb", SQL_NTS, (SQLCHAR*)"pz", SQL_NTS, (SQLCHAR*)"123", SQL_NTS);
    if (ret != SQL_SUCCESS) {
        printf("Failed to connect the database\n\n");
    }
    else {
        printf("Connected to the database\n\n");
    }


    SQLHSTMT hStmt3 = NULL;
    SQLCHAR* create3 = (SQLCHAR*)"CREATE TABLE b(a varchar); ";
    SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt3);
    ret = SQLExecDirect(hStmt3, create3, SQL_NTS);
    if (ret != SQL_SUCCESS) {
        printf("execute failed\n");
    }
    else {
        printf("execute success\n");
    }

    SQLHSTMT hStmt4 = NULL;
    SQLCHAR* query4 = (SQLCHAR*)"INSERT INTO b VALUES ('中文读取'); ";
    SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt4);
    ret = SQLExecDirect(hStmt4, query4, SQL_NTS);
    if (ret != SQL_SUCCESS) {
        printf("execute failed\n");
    }
    else {
        printf("execute success\n");
    }


    SQLHSTMT hStmt9 = NULL;
    SQLCHAR* query9 = (SQLCHAR*)"select * from b;";
    // 分配语句句柄
    SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt9);
    // 执行查询
    ret = SQLExecDirect(hStmt9, query9, SQL_NTS);
    if (ret != SQL_SUCCESS) {
        printf("execute failed\n");
    }
    else {
        printf("execute success\n");
        ret = SQLBindCol(hStmt9, 1, SQL_C_CHAR, &menuID, sizeof(menuID), NULL);

        // 检索数据
        while ((ret = SQLFetch(hStmt9)) == SQL_SUCCESS) {
            printf("a: %s\n", menuID);
        }

        if (ret == SQL_NO_DATA) {
            printf("No more data\n");
        }
        else {
            printf("Failed to fetch data\n");
        }
    }

    // 释放句柄
    SQLFreeHandle(SQL_HANDLE_STMT, hStmt4);
    SQLFreeHandle(SQL_HANDLE_STMT, hStmt9);

    SQLDisconnect(hDbc);
    SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
    SQLFreeHandle(SQL_HANDLE_ENV, hEnv);

    return 0;
}




















 
 
 
 
 
 
 
 
 





























































Linux 系统

前提条件

安装软件依赖包

  • libgcc

    联系open in new window KWDB 技术支持人员。

  • postgresql-devel

    yum install postgresql-devel
    
  • unixODBC-devel

    yum install unixODBC-devel
    

安装 PostgreSQL ODBC 驱动

以下示例以 Kylin V10 操作系统为例,下载并安装 PostgreSQL ODBC 驱动 13.00.0000-1

  1. 下载并安装 PostgreSQL ODBC 驱动。

    wget https://update.cs2c.com.cn/NS/V10/V10SP3-2403/os/adv/lic/base/x86_64/Packages/postgresql-odbc-13.00.0000-1.ky10.x86_64.rpm
    sudo rpm -ivh postgresql-odbc-13.00.0000-1.ky10.x86_64.rpm
    
  2. 验证是否成功安装 PostgreSQL ODBC 驱动。

    • 验证是否成功安装 unixODBCopen in new window

      odbcinst -j
      
    • 验证是否成功安装 PostgreSQL ODBC 驱动。

      odbcinst -q -d
      

    用户也可以在 /etc/odbcinst.ini ⽂件中查看已安装的驱动程序。

配置 ODBC 数据源

  1. 打开 ODBC 配置文件(odbc.ini)。

    vim /etc/odbc.ini
    
  2. 配置数据源。

    [kwdb]
    Description = PostgreSQL
    Driver = PostgreSQL
    Trace = No
    TraceFile = /tmp/pgodbc.log
    Database = defaultdb
    Servername = xx.xx.xx.xx
    UserName = user1
    Password = 123456
    Port = pppp
    
    • Description:可选项,数据源描述信息。
    • Driver:ODBC 驱动的名称。
    • Trace:是否开启 ODBC 跟踪功能。默认情况下,不开启 ODBC 跟踪功能。
    • TraceFile:ODBC 跟踪日志的存储路径。
    • Database:KWDB 数据库的名称。
    • Servername:KWDB 数据库的 IP 地址。
    • UserName:连接数据库的用户名。
    • Password:身份验证时使用的密码。
    • Port:KWDB 数据库的连接端口。

    有关 PostgreSQL ODBC 的更多配置信息,参见 PostgreSQL ODBC 官方文档open in new window

  3. 验证 unixODBC 是否识别配置的数据源。

    odbcinst -q -s
    

    执行成功后,控制台输出以下信息:

    [kwdb]
    

连接示例

以下示例说明如何根据配置的数据源连接 KWDB 数据库并查询数据。

  1. 创建示例程序文件。

    以下示例创建一个名为 demo.cpp 的示例文件。

    vim demo.cpp
    
  2. 将以下配置示例添加至 demo.cpp 示例文件。

    #include <stdio.h>
    #include <sql.h>
    #include <sqlext.h>
    #include <fstream>
    #include <string>
    
    int main() {
        SQLHENV hEnv = NULL;
        SQLHDBC hDbc = NULL;
        SQLHSTMT hStmt = NULL;
        SQLRETURN retcode;
        SQLLEN id;
        SQLCHAR menuID[32];
        SQLCHAR menuName[128];
    
        // 分配环境句柄
        SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
        // 设置环境属性
        SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
        // 分配连接句柄
        SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
        // 连接数据库
        SQLRETURN ret;
        ret = SQLConnect(hDbc, (SQLCHAR*)"kwdb", SQL_NTS, (SQLCHAR*)"pz", SQL_NTS, (SQLCHAR*)"123", SQL_NTS);
        if (ret != SQL_SUCCESS) {
            printf("Failed to connect the database\n\n");
        }
        else {
            printf("Connected to the database\n\n");
        }
    
    
        SQLHSTMT hStmt3 = NULL;
        SQLCHAR* create3 = (SQLCHAR*)"CREATE TABLE b(a varchar); ";
        SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt3);
        ret = SQLExecDirect(hStmt3, create3, SQL_NTS);
        if (ret != SQL_SUCCESS) {
            printf("execute failed\n");
        }
        else {
            printf("execute success\n");
        }
    
        SQLHSTMT hStmt4 = NULL;
        SQLCHAR* query4 = (SQLCHAR*)"INSERT INTO b VALUES ('中文读取'); ";
        SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt4);
        ret = SQLExecDirect(hStmt4, query4, SQL_NTS);
        if (ret != SQL_SUCCESS) {
            printf("execute failed\n");
        }
        else {
            printf("execute success\n");
        }
    
    
        SQLHSTMT hStmt9 = NULL;
        SQLCHAR* query9 = (SQLCHAR*)"select * from b;";
        // 分配语句句柄
        SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt9);
        // 执行查询
        ret = SQLExecDirect(hStmt9, query9, SQL_NTS);
        if (ret != SQL_SUCCESS) {
            printf("execute failed\n");
        }
        else {
            printf("execute success\n");
            ret = SQLBindCol(hStmt9, 1, SQL_C_CHAR, &menuID, sizeof(menuID), NULL);
    
            // 检索数据
            while ((ret = SQLFetch(hStmt9)) == SQL_SUCCESS) {
                printf("a: %s\n", menuID);
            }
    
            if (ret == SQL_NO_DATA) {
                printf("No more data\n");
            }
            else {
                printf("Failed to fetch data\n");
            }
        }
    
        // 释放句柄
        SQLFreeHandle(SQL_HANDLE_STMT, hStmt4);
        SQLFreeHandle(SQL_HANDLE_STMT, hStmt9);
    
        SQLDisconnect(hDbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
        SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
    
        return 0;
    }
    





















     
     
     
     
     
     
     
     
     





























































  3. 使用 g++ 编译器编译 demo.cpp 示例文件。

    g++ demo.cpp -lodbc -o demo
    

    系统生成一个名为 demo 的⼆进制⽂件。

  4. 运行示例程序。

    ./demo
    

支持的 ODBC 接口

下表列出 KWDB 支持的 ODBC 接口。

接口
一致性级别
描述
SQLAllocHandle核心获取环境、连接、语句或描述符句柄。
SQLBindCol核心为结果列分配存储并指定数据类型。
SQLBindParameter核心为 SQL 语句中的参数分配存储。注意:ODBC 驱动在执行 prepare 操作时不支持多行参数绑定。使用多行绑定可能导致数据类型转换异常,建议改为逐行绑定参数。
SQLCloseCursor核心关闭已在语句句柄上打开的游标。
SQLColAttribute核心描述结果集中列的属性。
SQLColumns核心返回指定表中的列名列表。
SQLConnect核心按数据源名称、用户 ID 和密码连接到特定驱动程序。
SQLDataSources核心返回可用数据源的列表。
SQLDescribeCol核心描述结果集中的列。
SQLDisconnect核心关闭连接。
SQLDriverConnect核心通过连接字符串或请求驱动程序管理器和驱动程序为用户显示连接对话框连接到特定驱动程序。
SQLDrivers核心返回已安装驱动程序及其属性的列表。
SQLExecDirect核心执行语句。
SQLExecute核心执行已准备的语句。
SQLFetch核心返回多个结果行。
SQLFreeHandle核心释放环境、连接、语句或描述符句柄。
SQLFreeStmt核心结束语句处理,放弃挂起的结果,并(可选)释放与语句句柄关联的所有资源。
SQLGetConnectAttr核心返回连接属性的值。
SQLGetCursorName核心返回与语句句柄关联的游标名称。
SQLGetData核心返回结果集一行的一列的一部分或全部。 (适用于长数据值)
SQLGetDiagField核心返回诊断信息(诊断数据结构的单个字段)。
SQLGetDiagRec核心返回诊断信息(诊断数据结构的多个字段)。
SQLGetEnvAttr核心返回环境属性的值。
SQLGetFunctions核心返回支持的驱动程序函数。
SQLGetInfo核心返回有关特定驱动程序和数据源的信息。
SQLGetStmtAttr核心返回语句属性的值。
SQLGetTypeInfo核心返回关于支持数据类型的信息。
SQLNativeSql核心返回由驱动程序翻译的 SQL 语句的文本。
SQLNumParams核心返回 SQL 语句中的参数数量。
SQLNumResultCols核心返回结果集中的列数。
SQLParamData核心与 SQLPutData 结合使用,在执行时提供参数数据。 (适用于长数据值)
SQLPrepare核心准备 SQL 语句以供以后执行。
SQLPutData核心发送参数的部分或全部数据值。 (适用于长数据值)
SQLRowCount核心返回受到插入、更新或删除请求影响的行数。
SQLSetConnectAttr核心设置连接属性。
SQLSetCursorName核心指定游标名称。
SQLSetDescField核心设置单个描述符字段。
SQLSetEnvAttr核心设置环境属性。
SQLSetStmtAttr核心设置语句属性。将所有语句属性设置为缺省值以及将特定语句属性设置为非默认值。
SQLStatistics核心返回有关单个表以及与表关联的索引列表的统计信息。
SQLTables核心返回存储在特定数据源中的表名称的列表。
SQLMoreResults级别 1确定是否有更多的结果集可用,如果是,则初始化下一个结果集的处理。
SQLProcedures级别 1返回存储在特定数据源中的过程名称列表。
SQLSetPos级别 1将光标置于提取的数据块内,并允许应用程序刷新行集中的数据,或者更新或删除结果集中的数据。
SQLDescribeParam级别 2返回语句中特定参数的描述信息。