联 系 我 们
售前咨询
售后咨询
微信关注:星环科技服务号
更多联系方式 >
6.4.3 基于 ODBC 开发
更新时间:1/15/2025, 2:57:15 AM

ODBC(开放数据库连接)是一种广泛接受的应用程序编程接口,使用结构化查询语言(SQL)作为数据库访问语言,不仅可以避免应用程序直接操作数据库,同时增强了应用的移植性和维护性,提升开发效率,典型组件及架构如下图所示:

odbc app architecture
图 6.3.1:ODBC 程序典型架构
  • ODBC 客户端:使用 ODBC API 与数据库服务器交互的应用程序。

  • ODBC Driver:一个或一组包含针对特定数据库服务器的 ODBC API 实现的库。

  • ODBC Driver Manager:一个或一组可供 ODBC 客户端用来与 ODBC Driver 交互的库。

我们为您准备了丰富的教程,帮助您快速开发应用程序来连接和读写 ArgoDB 数据库,您可以按需阅读,也可以选择阅读所需文档:

  • 首次尝试开发:您可以阅读开发流程了解基本开发步骤,然后基于示例代码简单修改即可。

  • 熟悉开发流程:您可以阅读 ODBC API 支持,快速查找相关接口的使用说明。

环境准备

在正式开发应用程序前,您需要跟随下述步骤完成环境准备工作:

  • 下载 ODBC 驱动

  • 配置数据源

    • Windows 平台

    • Linux 平台

下载驱动

ODBC 驱动程序用于连接 Transwarp ArgoDB 数据库,在开发应用程序前,您需要登录 Transwarp Manager 平台下载相关驱动程序。

操作步骤
  1. 登录 Transwarp Manager 平台。

  2. 在集群页面的 Transwarp ArgoDB 区域框中,找到并单击运行中的 Quark 组件。

  3. 单击页面右上角的 图标,然后选择下载 ODBC 驱动。

  4. 在弹出的面板中,选择您的开发平台(如 Windows 64 位),然后单击下载

    download odbc driver
    图 6.3.2:下载 ODBC 驱动

    ODBC 驱动支持的平台如下:

    • Windows

    • CentOS 6/7

    • Ubuntu 20.04(X64 架构)

    • kylin v10(ARM X64 架构)

Windows 平台配置数据源

下载 ODBC 驱动后,您还需要参考本文流程,安装驱动并添加数据源配置,完成操作后即可开始程序的开发工作。

操作步骤
  1. 下载 ODBC 驱动

  2. 双击下载的 ODBC 驱动程序,跟随提示完成安装。

  3. Win 键,在弹出的页面中输入 odbc,单击结果中的 ODBC 数据源(64 位)。

  4. 在弹出的界面中,单击用户 DSN 页签中的添加

    add odbc dsn
    图 6.3.3:添加 DSN
  5. 在弹出的对话框中,双击 Transwarp Inceptor ODBC Driver 进行编辑。

  6. 根据下述说明,完成数据源配置。

    odbc driver settings
    图 6.3.4:配置数据源
    • Data Source Name:填写有业务意义的数据源名称。

    • Description:填写描述信息。

    • Host:数据库的连接地址,即 Quark 组件的服务地址,您可以登录 Transwarp Manager 平台,找到 Quark 组件并获取其服务地址。

    • Port:数据库服务端口,默认为 10000。

    • Database:要链接的数据库,默认为 default。

    • Inceptor Server Type:根据 Hive Server 版本选择,选择为 Inceptor Server 1 时,Mechanism 仅可设置为 NONE。

    • Mechanism:数据库认证方式,本案例选择为 Kerberos,此时需要填写 Realm 和 FQDN 信息,如选择为 LDAP,则需要填写 User Name 和 Password 信息。 关于 ArgoDB 的认证方式配置,见 Guardian 手册

  7. 单击 Test,通过连接测试后单击 OK,然后单击确定

  8. (可选)当使用 ODBC 出错时,您可以在跟踪页签跟踪相关日志。

    odbc trace log
    图 6.3.5:跟踪日志
    1. 跟踪完成后将 ODBC 的相关日志发送给 Transwarp 技术支持人员。

      该日志为 ODBC Driver Manager 日志,由 Windows 系统本身提供,描述了应用层调用驱动的 API 记录及其返回值。

    2. ODBC Driver 日志:由 ODBC 研发人员自己定义。

    由于该操作将会较大程度影响 ODBC 性能,推荐仅在排查故障时使用。

常见问题
  • 问:如何获取 ODBC Driver 日志?

    答:日志文件存放路径为 /tmp/odbc.log,如需调整路径,您可以打开 ODBC 驱动的安装目录中的 log4cplus.properties 文件,修改 log4cplus.appender.R.File 参数的值来调整日志存储路径。

    odbc log file demo
    图 6.3.6:调整日志路径
  • 问:如何调整 ODBC Driver 的日志等级?

    答:默认级别为 ERROR,您可以打开 ODBC 驱动的安装目录中的 log4cplus.properties 文件,修改 log4cplus.properties 文件中 log4cplus.rootLoggerlog4cplus.logger.ODBC.HANDLER 参数的值,例如改成 INFODEBUG

Linux 平台配置数据源

下载 ODBC 驱动后,您还需要参考本文流程,安装驱动并添加数据源配置,完成操作后即可开始程序的开发工作。

操作步骤

下述步骤以 CentOS 7(64位)操作系统为例演示操作流程,其他 Linux 平台操作流程类似。

  1. 登录 Linux 设备,执行下述命令安装 unixODBC,用于管理 ODBC 驱动。

    yum install unixODBC unixODBC-devel
    复制
  2. 执行 odbcinst -j 命令,确认 unixODBC 是否安装成功,正常输出示例如下。

    [root@local]# odbcinst -j
    unixODBC 2.3.4
    DRIVERS............: /etc/odbcinst.ini
    SYSTEM DATA SOURCES: /etc/odbc.ini
    FILE DATA SOURCES..: /etc/ODBCDataSources
    USER DATA SOURCES..: /root/.odbc.ini
    SQLULEN Size.......: 8
    SQLLEN Size........: 8
    SQLSETPOSIROW Size.: 8
    复制
  3. 安装 ODBC 驱动。

    1. 下载 ODBC 驱动,然后将下载好的驱动文件放至 Linux 设备中。

    2. 以 CentOS 为例,执行下述命令安装驱动。

      # 需根据下载的文件名称,替换下述命令中要安装的 rpm 包名称
      rpm -ivh inceptor-connector-odbc-8.31.0-1.el7.x86_64.rpm
      复制
  4. 通过 vim 命令完成 ODBC 的 DSN(数据源名称)信息的修改。

    关于 ArgoDB 的认证方式配置,见 Guardian 手册

    /usr/local/inceptor 下的 odbcinst.ini 和 odbc.ini 是配置模板,下面介绍两个文件的具体内容。

    odbc.ini 是 DSN(数据源名称)配置文件,已基于认证方式分类并提供了配置示例,以 LDAP 认证连接至 ArgoDB 数据库为例,我们仅需配置 [transwarp-hs2-ldap] 中包含的参数,具体如下:

    # 数据源名称
    [transwarp-hs2-ldap]
    # 连接的描述信息
    Description = LDAP test
    # 驱动名称,无需修改
    Driver = Transwarp Inceptor ODBC Driver
    # 数据库所属设备的 host 名称
    Server = idc1
    # Hive 版本,无需修改
    Hive = Hive Server 2
    # 数据库的连接地址,即 Quark 组件的服务地址,您可以登录 Transwarp Manager 平台,找到 Quark 组件并获取其服务地址。
    Host = 172.16.1.212
    # 数据库服务端口,默认为 10000
    Port = 10000
    # 要连接的数据库
    Database = default
    # 访问 ArgoDB 数据库的用户名和密码
    User = hive
    Password = ArgoDB@123
    # 认证方式为 LDAP,无需修改
    Mech = LDAP
    复制

    odbcinst.ini是驱动配置文件(无需修改):

    # 驱动名称,和 odbc.ini 中的 Driver 对应
    [Transwarp Inceptor ODBC Driver]
    # 驱动的描述信息
    Description=Transwarp Inceptor ODBC Driver
    # 驱动的具体位置
    Driver=/usr/local/lib64/libODBC4HiveServer2.so
    复制
  5. 设置完成后按下 Esc 键退出编辑模式,输入 :wq 并按回车键,保存配置并退出编辑界面。

  6. 执行下述命令,以覆盖当前系统配置,如需再次调整配置,可直接修改 /etc/odbc.ini 文件。

    sudo cp /usr/local/inceptor/odbc.ini /etc/odbc.ini
    sudo cp /usr/local/inceptor/odbcinst.ini /etc/odbcinst.ini
    复制
  7. 执行 isql -v {数据源名称} {用户名} {密码} 格式的命令测试 ODBC 连通性,正常连接的输出示例如下。

    root@local]# isql -v transwarp-hs2-ldap hive ArgoDB@123
    +---------------------------------------+
    | Connected!                            |
    |                                       |
    | sql-statement                         |
    | help [tablename]                      |
    | quit                                  |
    |                                       |
    +---------------------------------------+
    复制
常见问题
  • 问:通过 isql -v 命令测试 ODBC 连接时,遇到了一些报错信息,如何解决?

    答:可能遇到的错误信息及相关解决方案如下:

    错误提示 解决方案

    “Data source name not found, and no default driver specified”

    环境变量设置不正确或未设置,请参考本文的步骤 2 设置环境变量。

    “Connection refused”

    连接请求被拒绝,请检查服务端的防火墙设置,确保端口可正常通信。

    “No route to host”

    服务器连接地址配置错误或防火墙引起的网络通信,需检查地址配置正确性和网络连通性。

    “Can’t open lib '/usr/local/lib64/libODBC4HiveServer2.so' : file not found]”

    执行 ldd /usr/local/lib64/libODBC4HiveServer2.so,查看输出结果中提示 libsasl2.so.2=⇒not found,此时执行 ln -sv /usr/lib64/libsasl2.so.3.0.0 /usr/lib64/libsasl2.so.2 添加软链接即可解决

    “SASL Other:No worthy mechd found , Segmentation faild”

    执行命令 yum install cyrus-sasl-gssapi cyrus-sasl-plain -y 安装相关工具

  • 问:如何获取 ODBC Driver 日志?

    答:日志文件存放路径为 /tmp/odbc.log,如需调整路径,您可以修改 /usr/local/inceptor/log4cplus.properties 文件中 log4cplus.appender.R.File 参数的值。

    odbc log file demo linux
    图 6.3.7:调整日志路径
  • 问:如何调整 ODBC Driver?

    答:默认级别为 ERROR,修改 /usr/local/inceptor/log4cplus.properties 文件,调整 log4cplus.rootLoggerlog4cplus.logger.ODBC.HANDLER 参数的值,例如改成 INFODEBUG

开发流程

ArgoDB 支持完整的 SQL 标准语法,可兼容Oracle、IBM DB2、Teradata 方言,本章节中,我们将介绍应用程序与 ArgoDB 数据交互的通用流程:

odbc dev flow
图 6.3.8:ODBC 开发流程

您可以基于业务需求灵活调整上述流程,各步骤说明如下:

在开发应用程序前,您需要手动完成 Windows/Linux 平台下 ODBC 驱动安装和数据配置。

  1. 建立连接

    • 分配 Environment Handle 和 Connection Handle

    • 设置 ODBC 版本并连接到 ArgoDB

    • 设置可选的 Connection Attribute

  2. 初始化操作

    • 分配 Statement Handle

    • 设置可选的 Statement Attribute

  3. 执行 SQL:准备 SQL 语句并执行。

  4. 获取结果集:根据执行的 SQL 类型获取结果集:

    • SELECT/SHOW/Catalog API:获取列信息、行信息等,将数据加入缓存

    • DELETE/UPDATE/INSERT:获取受影响的行数

  5. 处理事务:提交或回滚事务,如无事务操作则无需此步骤。

  6. 断开连接:断开连接,释放 Connection Handle 和 Environment Handle。

示例代码

为帮助您更好地上手 ArgoDB 相关应用程序的开发,本章节提供了多种语言的示例代码,演示如何操作 ArgoDB 数据库。

C 示例代码

本文介绍 C 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。

  1. 本段代码为头文件 common.h,包括必要的头文件、变量声明、函数声明。

    // 本示例展示如何连接数据库、创建表、插入数据、查询并打印结果、删除表
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #ifdef WIN32
    #include <windows.h>
    #endif
    #include <sql.h>
    #include <sqlext.h>
    #ifdef WIN32
    #define snprintf _snprintf
    #endif
    SQLHENV env;
    SQLHDBC conn;
    SQLCHAR str[1024];
    HSTMT hstmt = SQL_NULL_HSTMT; //handle statement
    char table_name[]="zzz";//your table_name. This program use $table_name as a sample
    int rc;
    //check execution statement
    #define CHECK_STMT_RESULT(rc, msg, hstmt)   \
        if (!SQL_SUCCEEDED(rc)) \
        { \
            print_diag(msg, SQL_HANDLE_STMT, hstmt);    \
            exit(1);\
        }
    //output info
    void print_diag(char *msg, SQLSMALLINT htype, SQLHANDLE handle)
    {
        char sqlstate[32];
        char message[1000];
        SQLINTEGER nativeerror;
        SQLSMALLINT textlen;
        SQLRETURN ret;
        if (msg)
            printf("%s\n", msg);
        ret = SQLGetDiagRec(htype, handle, 1, (SQLCHAR*)sqlstate, &nativeerror,
                            (SQLCHAR*)message, 256, &textlen);
        if (ret == SQL_INVALID_HANDLE)
            printf("Invalid handle\n");
        else if (ret != SQL_ERROR)
            printf("%s=%s\n", (CHAR *)sqlstate, (CHAR *)message);
    }
    void connect_database(); //connect to database. 
    void create_table();//create a table
    void insert_into_table();//insert into table
    void select_all();//select * from table and print result
    void drop_table();//drop table
    void disconnect();
    复制
  2. 与 ArgoDB 建立连接。

    //connect to database.
    void connect_database() 
    {
        SQLCHAR dsn[1024]; //dsn name
        SQLSMALLINT strl;
        snprintf((char*)dsn,sizeof(dsn), "DSN=your_inceptor_odbc_data_source_name");
    // Allocate an environment
        rc =SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
        CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate an environment  failed", hstmt);
    // Register this as an application that expects 3.x behavior
        rc =SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void *) SQL_OV_ODBC3, 0);
        CHECK_STMT_RESULT(rc, "SQLExecDirectRegister this as an application failed", hstmt);
    // Allocate a connection
        rc =SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
        CHECK_STMT_RESULT(rc, "SQLExecDirect Allocate a connection failed", hstmt);
    // Connect to the driver
        rc =SQLDriverConnect(conn, NULL, dsn, SQL_NTS,
                               str, sizeof(str), &strl,
                               SQL_DRIVER_COMPLETE);
        CHECK_STMT_RESULT(rc, "SQLExecDirect Connect to the driver failed", hstmt);
        printf("Connected.\n");
    }
    复制
  3. 创建表 table_name。

    //create a table
    void create_table()
    {
        if(NULL == table_name) {
            printf("WRONG! table_name can't be NULL\n");
            exit(1);
        }
        // Allocate a statement
        rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
        CHECK_STMT_RESULT(rc, "SQLExecDirect  Allocate a statement failed", hstmt);
    //use odbc;
        rc =SQLExecDirect(hstmt, (SQLCHAR *) "use odbc", SQL_NTS);
        CHECK_STMT_RESULT(rc, "SQLExecDirect Execute a sql failed", hstmt);
    // Execute a sql
        char create_table_sql[200];
        snprintf(create_table_sql,sizeof(create_table_sql),"create table if not exists %s(i int, s string) stored as holodesk",table_name); //DSN=[your dsn description] 
        rc =SQLExecDirect(hstmt, (SQLCHAR *)create_table_sql, SQL_NTS);
        CHECK_STMT_RESULT(rc, "SQLExecDirect Execute a sql failed", hstmt);
    //  Free ODBC handles
        rc =SQLFreeStmt(hstmt, SQL_CLOSE);
        CHECK_STMT_RESULT(rc, "SQLExecDirect  Free ODBC handles failed", hstmt);
        printf("Table %s created.\n",table_name);
    }
    复制
  4. 向表中插入数据。

    //insert into table
    void insert_into_table()
    {
        // Allocate a statement
        rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
        CHECK_STMT_RESULT(rc, "SQLExecDirect  Allocate a statement failed", hstmt);
        char insert_sql1[100];
        snprintf(insert_sql1,sizeof(insert_sql1),"insert into %s(i,s)  values(1,'foo')",table_name);
        char insert_sql2[100];
        snprintf(insert_sql2,sizeof(insert_sql2),"insert into %s(i,s)  values(2,'bar')",table_name);
        /* insert values*/
        rc = SQLExecDirect(hstmt, (SQLCHAR *) insert_sql1, SQL_NTS);
        CHECK_STMT_RESULT(rc, "SQLExecDirect insert into table failed", hstmt);
        rc = SQLExecDirect(hstmt, (SQLCHAR *) insert_sql2, SQL_NTS);
        CHECK_STMT_RESULT(rc, "SQLExecDirect insert into table failed", hstmt);
        printf("Insert values into table %s done.\n",table_name);
    }
    复制
  5. 查询并打印结果集。

    //select * from table and print result
    void select_all()
    {
        SQLINTEGER longvalue;
        SQLLEN      indLongvalue;
        char    charvalue[100];
        SQLLEN  indCharvalue;
        // Allocate a statement
        rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
        CHECK_STMT_RESULT(rc, "SQLExecDirect  Allocate a statement failed", hstmt);
        /* bind column1 */
        rc = SQLBindCol(hstmt, 1, SQL_C_LONG, &longvalue, 0, &indLongvalue);
        CHECK_STMT_RESULT(rc, "SQLBindCol failed", hstmt);
        rc = SQLBindCol(hstmt, 2, SQL_C_CHAR, &charvalue, sizeof(charvalue), &indCharvalue);
        CHECK_STMT_RESULT(rc, "SQLBindCol failed", hstmt);
        char select_sql[100];
        snprintf(select_sql,sizeof(select_sql),"select * from %s",table_name);
        rc = SQLExecDirect(hstmt, (SQLCHAR *) select_sql, SQL_NTS);
        CHECK_STMT_RESULT(rc, "SQLExecDirect select failed", hstmt);
        printf("Result set:\n");
        while(1)
        {
            rc = SQLFetch(hstmt);
            if (rc == SQL_NO_DATA)
                break;
            if (rc == SQL_SUCCESS)
            {
                printf("%ld %s\n", (long) longvalue, charvalue);
            }
            else
            {
                print_diag("SQLFetch failed", SQL_HANDLE_STMT, hstmt);
                //exit(1);//commented by yangyao
            }
        }
        rc = SQLFreeStmt(hstmt, SQL_CLOSE);
        CHECK_STMT_RESULT(rc, "SQLFreeStmt failed", hstmt);
        printf("\nSelect fropm table %s done.\n",table_name);
    }
    复制
  6. 删除表 table_name。

    //drop table
    void drop_table()
    {
        // Allocate a statement
        rc =SQLAllocHandle(SQL_HANDLE_STMT, conn, &hstmt);
        CHECK_STMT_RESULT(rc, "SQLExecDirect  Allocate a statement failed", hstmt);
        //drop sql statement
        char drop_sql[100];
        snprintf(drop_sql,sizeof(drop_sql),"drop table %s",table_name);
        //execute drop_sql
        rc = SQLExecDirect(hstmt, (SQLCHAR *) drop_sql, SQL_NTS);
        CHECK_STMT_RESULT(rc, "SQLExecDirect drop failed", hstmt);
        printf("Drop table %s done.\n",table_name);
    }
    复制

    程序所使用的 main 函数如下:

    #include "common.h"
    void main()
    {
        connect(); //connect to database.
        create_table();//create a table
        insert_into_table();//insert into table
        select_all();//select * from table and print result
        drop_table();//drop table
    }
    复制
C# 示例代码

本文介绍 C# 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Odbc;
namespace catt1{
    class Program{
        static void Main(string[] args){
            try{
                //connect odbc by specifying DSN name
                OdbcConnection connection = new OdbcConnection("DSN=your_inceptor_odbc_data_source_name");
                connection.Open();
                //create table
                string createTable = "create table tt(c1 int , c2 int) stored as holodesk"; 
                OdbcCommand command = new OdbcCommand(createTable, connection);
                command = new OdbcCommand(createTable, connection);
                command.ExecuteNonQuery();
                //insert data
                string insertTable = "insert into tt(c1,c2) values(?,?)";
                command = new OdbcCommand(insertTable, connection);
                command.CommandType = System.Data.CommandType.Text;
                command.Parameters.AddWithValue("@c1", 1);
                command.Parameters.AddWithValue("@c2", 2);
                command.ExecuteNonQuery();
                //select data with DataReader
                string selectTalbe = " select * from tt";
                command = new OdbcCommand(selectTalbe, connection);
                OdbcDataReader reader = command.ExecuteReader();
                while (reader.Read()){
                    Console.Out.Write(reader[0].ToString() + "\t");
                    Console.Out.WriteLine(reader[1].ToString());
                }
                //select data with OdbcDataAdapter
                OdbcDataAdapter da = new OdbcDataAdapter(selectTalbe, connection);
                System.Data.DataSet ds = new System.Data.DataSet();
                da.Fill(ds, "tt");
                //drop table
                string dropTable = "drop table if exists tt";
                command = new OdbcCommand(dropTable, connection);
                command.ExecuteNonQuery();
                //close connection
                connection.Close();
            }catch (Exception ex){
                Console.WriteLine(ex.Message);
            }
        }
    }
}
复制
Python 示例代码

本文介绍 Python 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。

使用该代码前,请先安装 pyodbc 模块

import pyodbc
#connect odbc
cnxn = pyodbc.connect("DSN=your_inceptor_odbc_data_source_name")

# Python 2.7, 避免中文乱码
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setencoding(str, encoding='utf-8')
cnxn.setencoding(unicode, encoding='utf-8')

# Python 3.x,避免中文乱码
cnxn.setdecoding(pyodbc.SQL_CHAR, encoding='utf-8')
cnxn.setdecoding(pyodbc.SQL_WCHAR, encoding='utf-8')
cnxn.setencoding(encoding='utf-8')

cursor = cnxn.cursor()
#create table
cursor.execute("create table tt(c1 int , c2 int) stored as holodesk") 
#insert data,INSERT INTO VALUES 语法只支持 Holodesk、TORC 等事务表,其余表只支持 INSERT INTO SELECT 插入。
cursor.execute("insert into tt values (?,?)", 1,1)
cursor.execute("insert into tt values (?,?)", 2,2)
#select data
row = cursor.execute("select * from tt").fetchone()
print row
#drop table
cursor.execute("drop table tt")
cnxn.close()
复制
Perl 示例代码

本文介绍 Perl 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。

环境准备

由于 Per 需要通过调用 DBI(数据库接口) 与 DBD::ODBC(ODBC 数据库驱动) 来访问 ArgoDB,在执行示例代码前,您还需要编译安装这两个模块,以 CentOS 65 为例:

  1. 安装 DBI。

    # 安装 DBI 所需的依赖包
    yum install perl perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
    # 下载并编译安装 DBI
    wget ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module/DBI/DBI-1.630.tar.gz
    tar -xvzf DBI-1.630.tar.gz
    cd DBI-1.630
    perl Makefile.PL
    make
    make install
    复制
  2. 安装 DBD::ODBC。

    wget ftp://ftp.funet.fi/pub/languages/perl/CPAN/modules/by-module/DBD/DBD-ODBC-1.52.tar.gz
    tar -xvzf DBD-ODBC-1.52.tar.gz
    cd DBD-ODBC-1.52
    perl Makefile.PL
    make
    make install
    复制
示例代码

完成上述操作后,即可尝试运行下述 Perl 示例代码:

#!/usr/bin/perl
use strict;
use DBI;
my $data_source="DBI:ODBC:your_odbc_data_source_name";
my $dbh=DBI->connect($data_source,"","", {AutoCommit => 1,PrintError=>1,RaiseError=>1});
sub select_data(){
    print "select data ...\n";
    my $sth=$dbh->prepare("select * from tt");
    $sth->execute();
    my @row;
    while (@row = $sth->fetchrow_array) {  # retrieve one row
        print join(", ", @row), "\n";
    }
    $sth->finish();
}
sub insert_data(){
    print "insert data ...\n";
    my $sth=$dbh->prepare("insert into tt values (?,1)");
    my $p = (1,2,3);
    $sth->execute($p);
    $sth->finish();
}
sub create(){
    $dbh->do("create table tt(c1 int , c2 int) stored as holodesk"); 
}
sub drop(){
    $dbh->do("drop table tt");
}
sub main(){
    drop();
    create();
    insert_data();
    select_data();
    drop();
    $dbh->disconnect();
}
my $ret =main();
exit($ret);
复制
Ruby 示例代码

本文介绍 Ruby 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。

环境准备

由于 Ruby 需要通过调用 DBI(数据库接口) 与 DBD::ODBC(ODBC 数据库驱动) 来访问 ArgoDB,在执行示例代码前,您还需要编译安装这两个模块。

CentOS 平台

  1. 安装 Ruby。

    yum install ruby ruby-dev -y
    复制
  2. 前往 Ruby-ODBC 下载站点,下载 0.9994 版本并将其放至 CentOS 65 设备 中。

  3. 解压并安装 Ruby-ODBC。

    # 解压文件并进入解压后目录
    tar -zxvf ruby-odbc-0.994.tar.gz && cd ruby-odbc-0.994
    # 编译安装,--with-odbc-dir 必须指向odbc driver manager的位置
    # 例如 driver manager 的库为 /usr/lib/x86_64-linux-gnu/libodbc.so.1,则该选项如下
    ruby ext/extconf.rb --with-odbc-dir=/usr/lib/x86_64-linux-gnu
    复制
  4. 安装 DBI 和 DBD::ODBC。

    sudo gem install dbi
    sudo gem install dbd-odbc
    复制

Windows 平台

  1. 下载并安装 Ruby,推荐下载 3.1.4-1 版本。

  2. 执行下述命令,安装 Ruby-ODBC。

    gem install ruby-odbc
    复制
  3. 执行下述命令,安装 DBI 和 DBD::ODBC。

    gem install dbi
    gem install dbd-odbc
    复制
示例代码

完成上述操作后,即可尝试运行下述 Ruby 示例代码:

# inceptor_odbc.rb - simple Incepotr script using Ruby DBI module
 require "dbi"
 begin
     # connect to the MySQL server
     dbh = DBI.connect("dbi:ODBC:your_inceptor_data_source_name", "", "")
     # create transaction table
     dbh.do("create table rubytest(c1 int , c2 int) stored as holodesk")
     #insert table
     sth = dbh.prepare("INSERT INTO rubytest (c1,c2) VALUES(?,1)")
     sth.execute(2);
     sth.finish
     #select data
     sth = dbh.execute("SELECT * FROM rubytest")
     sth.each do |row|
        printf "c1: %d, c2: %d/n", row[0], row[1]
     end
     sth.finish
     #drop table
     dbh.do("drop table rubytest")
 rescue DBI::DatabaseError => e
     puts "An error occurred"
     puts "Error code: #{e.err}"
     puts "Error message: #{e.errstr}"
 ensure
     # disconnect from server
     dbh.disconnect if dbh
 end
复制
PHP 示例代码

本文介绍 PHP 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
    <head>
        <title>PHP and ODBC: XHTML Example 1</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
    <?php
        $conn = odbc_connect("transwarp-hs2-lda", "", ""); // dsn name, user, password
        if (!($conn)) {
          echo "<p>Connection to DB via ODBC failed: ";
          echo odbc_errormsg ($conn );
          echo "</p>\n";
        }
        $create_table="create table phptest(c1 int , c2 int) stored as holodesk";
        $success = odbc_do($conn,"drop table if exists phptest");
        $success = odbc_do($conn,$create_table);
        $success = odbc_exec($conn,"insert into phptest values(1, 2)");
        $rs = odbc_exec($conn,"select * from phptest");
        echo "<table><tr>";
        echo "<th>Test</th></tr>";
        while (odbc_fetch_row($rs))
         {
         $result = odbc_result($rs,"c1");
         echo "<tr><td>c1: $result</td></tr>";
        }
        odbc_do($conn,"drop table if exists phptest");
        odbc_close($conn);
        echo "</table>";
    ?>
    </body>
</html>
复制
ODBC API 支持

ArgoDB 支持 3.x 版本的 ODBC API,本文介绍支持的 API 列表供您参考,详细的用法介绍和一致性级别说明,见 Microsoft ODBC API 参考

连接数据源
API 一致性级别 说明

SQLAllocHandle

ISO 92

分配环境、连接、语句或描述符句柄。

SQLConnect

ISO 92

在驱动程序和数据源间建立连接,连接句柄引用与数据源的连接的所有信息的存储,包括状态、事务状态和错误信息。

SQLDriverConnect

ODBC

可替代 SQLConnect,使用连接字符串或对话框连接到数据源。

SQLBrowseConnect

ODBC

发现和枚举连接到数据源所需的特性和属性值。

SQLAllocEnv

已弃用

由 SQLAllocHandle 取代。

SQLAllocConnect

已弃用

由 SQLAllocHandle 取代。

SQLAllocStmt

已弃用

由 SQLAllocHandle 取代。

获取驱动/数据源信息
API 一致性级别 说明

SQLDataSources

ISO 92

返回数据源的相关信息,由驱动程序管理器实现。

SQLDrivers

ODBC

返回驱动程序说明和属性信息,由驱动程序管理器实现。

SQLGetInfo

ISO 92

返回特定驱动程序和数据源的信息。

SQLGetFunctions

ISO 92

返回相关驱动程序是否支持函数。

SQLGetTypeInfo

ISO 92

返回数据源支持的数据类型信息。

设置/获取驱动属性
API 一致性级别 说明

SQLSetConnectAttr

ISO 92

设置连接属性。

SQLGetConnectAttr

ISO 92

返回连接属性的设置。

SQLSetEnvAttr

ISO 92

设置环境属性。

SQLGetEnvAttr

ISO 92

返回环境属性的设置。

SQLSetStmtAttr

ISO 92

设置语句属性。

SQLGetStmtAttr

ISO 92

返回语句属性的设置。

SQLSetConnectOption

已弃用

由 SQLSetConnectAttr 取代。

SQLGetConnectOption

已弃用

由 SQLGetConnectAttr 取代。

SQLSetStmtOption

已弃用

由 SQLSetStmtAttr 取代。

SQLGetStmtOption

已弃用

由 SQLGetStmtAttr 取代。

SQLParamOptions

已弃用

由 SQLSetStmtAttr 取代。

设置/获取描述符字段
API 一致性级别 说明

SQLGetDescField

ISO 92

获取单个描述符字段的值。

SQLGetDescRec

ISO 92

获取多个描述符字段的值。

SQLSetDescField

ISO 92

设置单个描述符字段。

SQLSetDescRec

ISO 92

设置多个描述符字段。

SQLCopyDesc

ISO 92

将描述符信息从一个描述符句柄复制到另一个描述符句柄。

准备 SQL 请求
API 一致性级别 说明

SQLPrepare

ISO 92

准备稍后执行的 SQL 语句。

SQLBindParameter

ODBC

将缓冲区绑定到 SQL 语句中的参数标记。

SQLGetCursorName

ISO 92

返回与指定语句句柄关联的游标名。

SQLSetCursorName

ISO 92

设置游标名。

SQLSetScrollOptions

已弃用

由 SQLGetInfo 和 SQLSetStmtAttr 取代。

SQLSetParam

已弃用

由 SQLBindParameter 取代。

提交请求
API 一致性级别 说明

SQLExecute

ISO 92

执行已准备的 SQL 语句。

SQLExecDirect

ISO 92

执行 SQL 语句。

SQLNativeSql

ODBC

返回由驱动程序翻译的 SQL 语句文本。

SQLDescribeParam

ODBC

返回语句中的参数信息,Connector/ODBC不支持,返回结果仅为参考。

SQLNumParams

ISO 92

返回 SQL 语句中参数的数量。

SQLParamData

ISO 92

与 SQLPutData 结合使用,在执行时提供参数数据。

SQLPutData

ISO 92

发送参数的部分或全部数据值。

SQLTransact

已弃用

由 SQLEndTran 取代。

获取结果及其相关信息
API 一致性级别 说明

SQLRowCount

ISO 92

返回受 INSERT、UPDATE、DELETE 请求语句所影响的行数。

SQLNumResultCols

ISO 92

返回结果集中列的数量。

SQLDescribeCol

ISO 92

返回结果集中列的信息。

SQLColAttribute

ISO 92

返回结果集中列的描述符信息。

SQLFetch

ISO 92

返回多行结果数据。

SQLFetchScroll

ISO 92

返回滚动的数据行。

SQLSetPos

ODBC

设置行集中的游标位置,并允许应用程序刷新行集中的数据或更新/删除结果集中的数据。

SQLBulkOperations

ODBC

执行批量插入和批量书签操作,包括通过书签进行更新、删除和提取。

SQLMoreResults

ODBC

确定是否有更多结果集可用,如有则执行初始化以对结果集进行处理。

SQLGetDiagField

ISO 92

返回诊断记录的单个字段的当前值,包含错误、警告和状态信息。

SQLGetDiagRec

ISO 92

返回诊断记录的多个字段的当前值,包含错误、警告和状态信息。

SQLBindCol

ISO 92

将应用程序数据缓冲区绑定到结果集中的列。

SQLGetData

ISO 92

返回结果集一行的部分/全部数据列数据。

SQLError

已弃用

由 SQLGetDiagRec 取代。

SQLColAttributes

已弃用

由 SQLColAttribute 取代。

SQLExtendedFetch

已弃用

由 SQLFetchScroll 取代。

获取数据源的系统表信息
API 一致性级别 说明

SQLColumnPrivileges

ODBC

返回指定表的列和关联权限的列表。

SQLColumns

Open Group

返回指定表的列名。

SQLForeignKeys

ODBC

返回外键的列名。

SQLPrimaryKeys

ODBC

返回主键的列名。

SQLSpecialColumns

Open Group

返回指定表中列的信息,包含唯一标识表中行的最佳列集、事务更新行中的任何值时自动更新的列。

SQLStatistics

ISO 92

返回有关单个表的统计信息。

SQLTablePrivileges

ODBC

返回表列表与每个表关联的特权信息。

SQLTables

Open Group

返回指定数据源中的表名。

SQLProcedures

ODBC

返回指定数据源中的过程名。

SQLProcedureColumns

ODBC

返回过程的参数和结果集列。

终止语句
API 一致性级别 说明

SQLFreeStmt

ISO 92

结束语句处理,放弃挂起的结果,释放与语句句柄关联的所有资源。

SQLCloseCursor

ISO 92

关闭已在语句句柄上打开的游标,同时丢弃挂起的结果。

SQLCancel

ISO 92

取消语句的处理。

SQLCancelHandle

ODBC

取消对连接或语句的处理。

SQLEndTran

ISO 92

提交或回滚事务。

终止连接
API 一致性级别 说明

SQLDisconnect

ISO 92

关闭连接。

SQLFreeHandle

ISO 92

释放与特定环境、连接、语句或描述符句柄关联的资源。

SQLFreeConnect

已废弃

由 SQLFreeHandle 取代。

SQLFreeEnv

已废弃

由 SQLFreeHandle 取代。

API 映射关系说明

ArgoDB 目前采用的 ODBC 驱动为 3.x 版本,当用其调用 2.x 版本的应用程序时,会根据下表自动映射并转换。

ODBC 2.x ODBC 3.x

SQLAllocConnect

SQLAllocHandle

SQLAllocEnv ①

SQLAllocStmt

SQLBindParam

SQLBindParameter

SQLColAttributes

SQLColAttribute

SQLError

SQLGetDiagRec

SQLFreeConnect

SQLFreeHandle

SQLFreeEnv

SQLFreeStmt

SQLGetConnectOption

SQLGetConnectAttr

SQLGetStmtOption

SQLGetStmtAttr

SQLParamOptions

SQLSetStmtAttr

SQLSetConnectOption

SQLSetConnectAttr

SQLSetParam

SQLBindParameter

SQLSetScrollOption

SQLSetStmtAttr

SQLSetStmtOption

SQLTransact

SQLEndTran

:应用程序通过 ODBC 3.x 驱动调用该接口时,会自动调用 SQLSetEnvAttr 并将 SQL_ATTR_ODBC_VERSION 环境属性设置为 SQL_OV_ODBC2,再映射到 SQLAllocHandle。

Catelog API 支持说明

Catelog API 字符串参数分为四种不同类型的:普通参数(OA)、模式值参数(PV)、标识符参数(ID)和值列表参数(VL),更多介绍,见Catelog API。下表列出了当前对 Catelog API 的支持情况:

函数 参数 SQL_时键入 ATTR_METADATA_ID = SQL_FALSE 是否支持 SQL_时键入 ATTR_METADATA_ID = SQL_TRUE 是否支持

SQLColumnPrivileges

CatalogName SchemaName TableName ColumnName

OA OA OA PV

18

ID ID ID ID

18

SQLColumns

CatalogName SchemaName TableName ColumnName

OA PV PV PV

18

ID ID ID ID

18

SQLForeignKeys

PKCatalogName PKSchemaName PKTableName FKCatalogName FKSchemaName FKTableName

OA OA OA OA OA OA

18

ID ID ID ID ID ID

18

SQLPrimaryKeys

CatalogName SchemaName TableName

OA OA OA

18

ID ID ID

18

SQLProcedureColumns

CatalogName SchemaName ProcName ColumnName

OA PV PV PV

18

ID ID ID ID

18

SQLProcedures

CatalogName SchemaName ProcName

OA PV PV

18

ID ID ID

18

SQLSpecialColumns

CatalogName SchemaName TableName

OA OA OA

18

ID ID ID

18

SQLStatistics

CatalogName SchemaName TableName

OA OA OA

18

ID ID ID

18

SQLTablePrivileges

CatalogName SchemaName TableName

OA PV PV

18

ID ID ID

18

SQLTables

CatalogName SchemaName TableName TableType

PV PV PV VL

18

ID ID ID VL

18