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

-
ODBC 客户端:使用 ODBC API 与数据库服务器交互的应用程序。
-
ODBC Driver:一个或一组包含针对特定数据库服务器的 ODBC API 实现的库。
-
ODBC Driver Manager:一个或一组可供 ODBC 客户端用来与 ODBC Driver 交互的库。
我们为您准备了丰富的教程,帮助您快速开发应用程序来连接和读写 ArgoDB 数据库,您可以按需阅读,也可以选择阅读所需文档:
-
首次尝试开发:您可以阅读开发流程了解基本开发步骤,然后基于示例代码简单修改即可。
-
熟悉开发流程:您可以阅读 ODBC API 支持,快速查找相关接口的使用说明。
环境准备
在正式开发应用程序前,您需要跟随下述步骤完成环境准备工作:
-
下载 ODBC 驱动
-
配置数据源
-
Windows 平台
-
Linux 平台
-
下载驱动
ODBC 驱动程序用于连接 Transwarp ArgoDB 数据库,在开发应用程序前,您需要登录 Transwarp Manager 平台下载相关驱动程序。
操作步骤
-
登录 Transwarp Manager 平台。
-
在集群页面的 Transwarp ArgoDB 区域框中,找到并单击运行中的 Quark 组件。
-
单击页面右上角的 … 图标,然后选择下载 ODBC 驱动。
-
在弹出的面板中,选择您的开发平台(如 Windows 64 位),然后单击下载。
图 6.3.2:下载 ODBC 驱动ODBC 驱动支持的平台如下:
-
Windows
-
CentOS 6/7
-
Ubuntu 20.04(X64 架构)
-
kylin v10(ARM X64 架构)
-
Windows 平台配置数据源
下载 ODBC 驱动后,您还需要参考本文流程,安装驱动并添加数据源配置,完成操作后即可开始程序的开发工作。
操作步骤
-
双击下载的 ODBC 驱动程序,跟随提示完成安装。
-
按 Win 键,在弹出的页面中输入 odbc,单击结果中的 ODBC 数据源(64 位)。
-
在弹出的界面中,单击用户 DSN 页签中的添加。
图 6.3.3:添加 DSN -
在弹出的对话框中,双击 Transwarp Inceptor ODBC Driver 进行编辑。
-
根据下述说明,完成数据源配置。
图 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 手册。
-
-
单击 Test,通过连接测试后单击 OK,然后单击确定。
-
(可选)当使用 ODBC 出错时,您可以在跟踪页签跟踪相关日志。
图 6.3.5:跟踪日志-
跟踪完成后将 ODBC 的相关日志发送给 Transwarp 技术支持人员。
该日志为 ODBC Driver Manager 日志,由 Windows 系统本身提供,描述了应用层调用驱动的 API 记录及其返回值。
-
ODBC Driver 日志:由 ODBC 研发人员自己定义。
由于该操作将会较大程度影响 ODBC 性能,推荐仅在排查故障时使用。
-
常见问题
-
问:如何获取 ODBC Driver 日志?
答:日志文件存放路径为 /tmp/odbc.log,如需调整路径,您可以打开 ODBC 驱动的安装目录中的 log4cplus.properties 文件,修改 log4cplus.appender.R.File 参数的值来调整日志存储路径。
图 6.3.6:调整日志路径 -
问:如何调整 ODBC Driver 的日志等级?
答:默认级别为 ERROR,您可以打开 ODBC 驱动的安装目录中的 log4cplus.properties 文件,修改 log4cplus.properties 文件中 log4cplus.rootLogger 和 log4cplus.logger.ODBC.HANDLER 参数的值,例如改成 INFO 或 DEBUG。
Linux 平台配置数据源
下载 ODBC 驱动后,您还需要参考本文流程,安装驱动并添加数据源配置,完成操作后即可开始程序的开发工作。
操作步骤
下述步骤以 CentOS 7(64位)操作系统为例演示操作流程,其他 Linux 平台操作流程类似。
-
登录 Linux 设备,执行下述命令安装 unixODBC,用于管理 ODBC 驱动。
yum install unixODBC unixODBC-devel
复制 -
执行 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
复制 -
安装 ODBC 驱动。
-
下载 ODBC 驱动,然后将下载好的驱动文件放至 Linux 设备中。
-
以 CentOS 为例,执行下述命令安装驱动。
# 需根据下载的文件名称,替换下述命令中要安装的 rpm 包名称 rpm -ivh inceptor-connector-odbc-8.31.0-1.el7.x86_64.rpm
复制
-
-
通过
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
复制 -
设置完成后按下 Esc 键退出编辑模式,输入 :wq 并按回车键,保存配置并退出编辑界面。
-
执行下述命令,以覆盖当前系统配置,如需再次调整配置,可直接修改 /etc/odbc.ini 文件。
sudo cp /usr/local/inceptor/odbc.ini /etc/odbc.ini sudo cp /usr/local/inceptor/odbcinst.ini /etc/odbcinst.ini
复制 -
执行
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 参数的值。
图 6.3.7:调整日志路径 -
问:如何调整 ODBC Driver?
答:默认级别为 ERROR,修改 /usr/local/inceptor/log4cplus.properties 文件,调整 log4cplus.rootLogger 和 log4cplus.logger.ODBC.HANDLER 参数的值,例如改成 INFO 或 DEBUG。
开发流程
ArgoDB 支持完整的 SQL 标准语法,可兼容Oracle、IBM DB2、Teradata 方言,本章节中,我们将介绍应用程序与 ArgoDB 数据交互的通用流程:

您可以基于业务需求灵活调整上述流程,各步骤说明如下:
-
建立连接
-
分配 Environment Handle 和 Connection Handle
-
设置 ODBC 版本并连接到 ArgoDB
-
设置可选的 Connection Attribute
-
-
初始化操作
-
分配 Statement Handle
-
设置可选的 Statement Attribute
-
-
执行 SQL:准备 SQL 语句并执行。
-
获取结果集:根据执行的 SQL 类型获取结果集:
-
SELECT/SHOW/Catalog API:获取列信息、行信息等,将数据加入缓存
-
DELETE/UPDATE/INSERT:获取受影响的行数
-
-
处理事务:提交或回滚事务,如无事务操作则无需此步骤。
-
断开连接:断开连接,释放 Connection Handle 和 Environment Handle。
示例代码
为帮助您更好地上手 ArgoDB 相关应用程序的开发,本章节提供了多种语言的示例代码,演示如何操作 ArgoDB 数据库。
C 示例代码
本文介绍 C 语言开发环境下,如何完成连接数据库、创建表、插入数据、查询数据和删除表的相关操作。
-
本段代码为头文件 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();
复制 -
与 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"); }
复制 -
创建表 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); }
复制 -
向表中插入数据。
//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); }
复制 -
查询并打印结果集。
//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); }
复制 -
删除表 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 为例:
-
安装 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
复制 -
安装 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 平台
-
安装 Ruby。
yum install ruby ruby-dev -y
复制 -
前往 Ruby-ODBC 下载站点,下载 0.9994 版本并将其放至 CentOS 65 设备 中。
-
解压并安装 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
复制 -
安装 DBI 和 DBD::ODBC。
sudo gem install dbi sudo gem install dbd-odbc
复制
Windows 平台
-
下载并安装 Ruby,推荐下载 3.1.4-1 版本。
-
执行下述命令,安装 Ruby-ODBC。
gem install ruby-odbc
复制 -
执行下述命令,安装 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 |
![]() |
ID ID ID ID |
![]() |
SQLColumns |
CatalogName SchemaName TableName ColumnName |
OA PV PV PV |
![]() |
ID ID ID ID |
![]() |
SQLForeignKeys |
PKCatalogName PKSchemaName PKTableName FKCatalogName FKSchemaName FKTableName |
OA OA OA OA OA OA |
![]() |
ID ID ID ID ID ID |
![]() |
SQLPrimaryKeys |
CatalogName SchemaName TableName |
OA OA OA |
![]() |
ID ID ID |
![]() |
SQLProcedureColumns |
CatalogName SchemaName ProcName ColumnName |
OA PV PV PV |
![]() |
ID ID ID ID |
![]() |
SQLProcedures |
CatalogName SchemaName ProcName |
OA PV PV |
![]() |
ID ID ID |
![]() |
SQLSpecialColumns |
CatalogName SchemaName TableName |
OA OA OA |
![]() |
ID ID ID |
![]() |
SQLStatistics |
CatalogName SchemaName TableName |
OA OA OA |
![]() |
ID ID ID |
![]() |
SQLTablePrivileges |
CatalogName SchemaName TableName |
OA PV PV |
![]() |
ID ID ID |
![]() |
SQLTables |
CatalogName SchemaName TableName TableType |
PV PV PV VL |
![]() |
ID ID ID VL |
![]() |