首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase Connector/ODBC 连接 OceanBase 数据库示例程序
更新时间:2026-05-27 19:08:20
本文将介绍如何使用 OceanBase Connector/ODBC 和 OceanBase 数据库构建一个应用程序,实现创建表、插入数据和查询数据等基本操作。
前提条件
您已安装 OceanBase 数据库并且创建 Oracle 模式的用户租户。安装 OceanBase 数据库的详细信息,请参见 部署概述。
您已安装 Visual Studio。
您已安装 OceanBase Connector/ODBC 驱动程序。
说明
请在 OceanBase 官方网站 资源 > 下载中心 > 企业版 页面下的 驱动和中间件 模块中下载 OceanBase ODBC 驱动程序 Windows 版本的安装包。Windows 版 OceanBase Connector/ODBC 驱动安装包为一键部署式,根据默认指导步骤安装即可。
操作步骤
说明
本文中给出的操作步骤是在 Windows 环境下使用 Visual Studio Community 2019 编译和运行该项目的步骤。如果您使用的是其他操作系统环境或编译器,那么操作步骤可能会略有不同。
- 打开
c-oceanbase-odbc项目。 - 配置
c-oceanbase-odbc项目属性。 - 获取 OceanBase 数据库连接信息。
- 修改
c-oceanbase-odbc项目中的数据库连接信息。 - 构建项目。
- 运行应用程序。
- 查看输出结果。
步骤一:打开 c-oceanbase-odbc 项目
启动 Visual Studio Community 2019。
打开现有项目。
在 Visual Studio Community 2019 的起始界面上,在开始使用下面点击 打开项目或解决方案(P) 按钮。或者在 Visual Studio Community 2019 的起始界面上,在开始使用下面点击 继续但无需代码(W) 按钮;在上面菜单栏中选择 文件 -> 打开 -> 项目/解决方案(P)。

浏览到 c-oceanbase-odbc 项目 的文件夹,选择项目文件(
c-oceanbase-odbc.sln或者c-oceanbase-odbc.vcxproj),然后点击 打开。
步骤二:配置 c-oceanbase-odbc 项目属性
打开项目的属性页。
在 解决方案管理器中 右键单击选定的项目,然后在上下文菜单中选择 属性,或者在 Visual Studio 的顶部菜单栏中选择 项目 -> 属性,或者使用快捷键 Alt + Enter。
配置管理器设置。
在属性页中选择上方找到 配置(C) 下拉菜单。在下拉菜单中,选择 Debug。
在属性页中选择上方找到 平台(P) 下拉菜单。在下拉菜单中,选择 x64。

字符集设置。
在属性页中选择 高级 选项卡,找到 字符集 一栏。在下拉菜单中,选择 使用多字节字符集。

步骤三:获取 OceanBase 数据库连接信息
联系 OceanBase 数据库部署人员或者管理员获取相应的数据库连接串。
示例如下:
obclient -hxxx.xxx.xxx.xxx -P2881 -usys@oracle001 -p******
参数说明:
-h:提供 OceanBase 数据库连接 IP。ODP 连接方式使用的是一个 ODP 地址;直连方式使用的是 OBServer 节点的 IP 地址。-P:提供 OceanBase 数据库连接端口。ODP 连接的方式默认是2883,在部署 ODP 时可自定义;直连方式默认是2881,在部署 OceanBase 数据库时可自定义。-u:提供租户的连接账户。ODP 连接的常用格式有:用户名@租户名#集群名或者集群名:租户名:用户名;直连方式格式:用户名@租户名。-p:提供账户密码。
更多连接串的信息,请参见 通过 OBClient 连接 OceanBase 租户。
步骤四:修改 c-oceanbase-odbc 项目中的数据库连接信息
根据 步骤三:获取 OceanBase 数据库连接信息 中的信息修改 test_tbl1.cpp 文件中的数据库连接信息。
示例如下:
char* mydriver = (char*)"Driver={OceanBase ODBC 2.0 Driver};Server=xxx.xxx.xxx.xxx;Port=2881;Database=sys;User=sys@oracle001;Password=******;Option=3;";

步骤五:构建项目
选择 生成 菜单,然后选择 生成解决方案。构建过程中会显示编译器的输出和任何错误或警告信息。

步骤六:运行应用程序
选择 调试 菜单,然后选择 开始调试 或者 开始执行(不调试) 来运行的应用程序。
步骤七:查看输出结果
输出结果将显示在调试控制台中。您可以根据程序的设计逻辑和代码来判断如何处理输出。

项目代码介绍
点击 c-oceanbase-odbc 下载项目代码,是一个名称为 c-oceanbase-odbc.zip 的压缩包。
解压后,得到一个名为 c-oceanbase-odbc 的文件夹。目录结构如下所示:
c-oceanbase-odbc
├─ c-oceanbase-odbc.sln
├─ c-oceanbase-odbc.vcxproj
├─ c-oceanbase-odbc.vcxproj.filters
├─ c-oceanbase-odbc.vcxproj.user
└─ test_tbl1.cpp
文件说明:
c-oceanbase-odbc.sln:Visual Studio 的解决方案文件,用于管理一个或多个项目。c-oceanbase-odbc.vcxproj:Visual Studio 的项目文件,用于描述一个 C/C++ 项目的结构和配置。c-oceanbase-odbc.vcxproj.filters:Visual Studio 的项目过滤器文件,用于定义项目中文件的目录结构和组织方式。c-oceanbase-odbc.vcxproj.user:用于存储用户特定的项目设置的文件。test_tbl1.cpp:定义数据表的结构和实现数据表操作的源代码文件。
test_tbl1.cpp 文件代码介绍
test_tbl1.cpp 文件用于定义名称为 test_tbl1 的数据表,实现了数据表的创建、插入数据和查询操作。
本文 test_tbl1.cpp 文件的代码主要包括以下几个部分:
引用头文件。
引用头文件
stdio.h、assert.h、windows.h、sql.h和sqlext.h。代码如下:
#include <stdio.h> #include <assert.h> #include <windows.h> #include <sql.h> #include <sqlext.h>定义函数
odbc_print_error。这个函数的作用是在程序运行过程中,如果出现 ODBC 相关的错误,就可以调用这个函数,打印出错误信息。具体步骤如下:
- 定义函数名称为
odbc_print_error,并指定参数SQLSMALLINT HandleType和SQLHANDLE Handle,用来指定错误信息所对应的句柄类型和句柄。 - 定义用于存储从 ODBC 中获取错误信息的变量。这些变量的类型和名称都是 ODBC API 中定义的数据类型和名称。
- 使用
SQLGetDiagRec()获取 ODBC 中最后一次生成的错误信息。在这个函数调用后,SQLState、NativeError和SQLMessage数组中存储了错误信息的相关内容。 - 使用
fprintf函数将错误信息打印到标准输出流中。[%s] (%d) %s\n是打印格式,它使用了类似于printf函数的格式化字符串。%s用于打印字符串类型的数据,%d用于打印整型数据,\n表示换行。SQLState、NativeError和SQLMessage分别对应了格式化字符串中的三个参数,表示要打印出的错误信息内容。
代码如下:
static void odbc_print_error(SQLSMALLINT HandleType, SQLHANDLE Handle) { SQLCHAR SQLState[6]; SQLINTEGER NativeError; SQLCHAR SQLMessage[SQL_MAX_MESSAGE_LENGTH] = { 0 }; SQLSMALLINT TextLengthPtr; SQLGetDiagRec(HandleType, Handle, 1, SQLState, &NativeError, SQLMessage, SQL_MAX_MESSAGE_LENGTH, &TextLengthPtr); fprintf(stdout, "[%s] (%d) %s\n", SQLState, NativeError, SQLMessage); }- 定义函数名称为
定义函数
ASSERT_CHECK。这个函数的作用是用于检查并处理 ODBC 函数调用的返回值,即检查 ODBC API 函数的返回值是否出现错误,如果出现错误就打印错误信息,并退出程序。具体步骤如下:
- 定义宏名称为
ASSERT_CHECK,并指定参数SQLSMALLINT HandleType、SQLHANDLE Handle和SQLRETURN rcode,分别是 ODBC 句柄类型、ODBC 句柄和 ODBC API 函数调用的返回值。 - 使用
if语句对 ODBC API 函数的返回值进行判断,如果返回值不等于SQL_SUCCESS或者SQL_SUCCESS_WITH_INFO,就表示函数调用出现了错误。 - 调用
odbc_print_error函数,打印出 ODBC 错误信息。 - 调用
assert函数,用于在程序运行过程中进行断言检查,即 ODBC 函数调用出现了错误,那么程序就会中断。
代码如下:
static void ASSERT_CHECK(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLRETURN rcode) { if (rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO) { odbc_print_error(HandleType, Handle); assert(0); } }- 定义宏名称为
定义函数
main。定义程序的入口函数
main,返回一个整数值。在main函数中,编写了与数据库连接、数据操作相关的代码。代码如下:
int main() { // 申请环境句柄 // 设置ODBC版本的环境属性 // 分配连接句柄 // 连接数据源 // 创建表 // 插入数据 // 查询数据 // 清理工作, 释放具体的资源句柄 }定义变量。
定义变量
henv,它是 ODBC 环境句柄类型的对象,用于管理 ODBC 连接和资源的分配。OutConnStr和OutConnStrLen用于存储连接字符串和字符串的长度,这些参数在连接到数据库时传递给SQLDriverConnect函数,以获得成功连接到数据库时的返回值和一些其他的连接信息。代码如下:
HENV henv; SQLCHAR OutConnStr[255]; SQLSMALLINT OutConnStrLen;申请环境句柄。
通过
SQLAllocHandle函数分配一个 ODBC 环境句柄,并通过ASSERT_CHECK函数检查分配句柄的结果,确保分配成功。具体步骤如下:SQLAllocHandle函数执行后,返回一个SQLRETURN类型的值,指示函数的执行结果。在代码中,这个返回值被存储在rcode变量中。SQLAllocHandle函数的参数如下:SQL_HANDLE_ENV:指定要分配的句柄的类型。在这里,它是SQL_HANDLE_ENV,表示要分配一个环境句柄。SQL_NULL_HANDLE:指定父句柄。在这里,它是SQL_NULL_HANDLE,表示没有父句柄。&henv:是一个指向存储分配句柄的变量的指针。在这里,它是henv,即环境句柄的变量。
ASSERT_CHECK函数被用于检查SQLAllocHandle函数的返回值rcode。如果rcode不是SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,即分配句柄失败,那么ASSERT_CHECK函数将调用odbc_print_error函数打印出错误信息,并使用assert宏终止程序的执行。
代码如下:
SQLRETURN rcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); ASSERT_CHECK(SQL_HANDLE_ENV, henv, rcode);设置 ODBC 版本的环境属性。
通过
SQLSetEnvAttr函数设置 ODBC 环境的属性,它可以设置一些环境级别的属性,以影响数据库连接和驱动程序的行为,并通过ASSERT_CHECK函数检查设置属性的结果,确保设置成功。具体步骤如下:SQLSetEnvAttr函数执行后,返回一个SQLRETURN类型的值,指示函数的执行结果。在代码中,这个返回值被存储在rcode变量中。SQLSetEnvAttr函数的参数如下:henv:是 ODBC 环境句柄,指定要设置属性的环境对象。SQL_ATTR_ODBC_VERSION:指定要设置的环境属性类型。在这里,它是SQL_ATTR_ODBC_VERSION,表示要设置 ODBC 版本的属性。(void*)SQL_OV_ODBC3:是属性值的指针。在这里,它是SQL_OV_ODBC3,表示将 ODBC 版本设置为 ODBC 3.x 版本。0:是属性值的长度。在这里,由于属性值是一个枚举常量,所以长度是0。
ASSERT_CHECK函数被用于检查SQLSetEnvAttr函数的返回值rcode。如果rcode不是SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,即设置属性失败,那么ASSERT_CHECK函数将调用odbc_print_error函数打印出错误信息,并使用assert宏终止程序的执行。
代码如下:
rcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); ASSERT_CHECK(SQL_HANDLE_ENV, henv, rcode);分配连接句柄。
通过
SQLAllocHandle函数分配一个ODBC连接句柄,并通过ASSERT_CHECK函数检查分配句柄的结果,确保分配成功。具体步骤如下:SQLAllocHandle函数执行后,返回一个SQLRETURN类型的值,指示函数的执行结果。在代码中,这个返回值被存储在rcode变量中。SQLAllocHandle函数的参数如下:SQL_HANDLE_DBC:指定要分配的句柄的类型。在这里,它是SQL_HANDLE_DBC,表示要分配一个连接句柄。henv:是一个已分配的ODBC环境句柄,作为父句柄,用于与连接句柄关联。&hdbc:是一个指向存储分配的连接句柄的变量的指针。
ASSERT_CHECK函数被用于检查SQLAllocHandle函数的返回值rcode。如果rcode不是SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,即分配句柄失败,那么ASSERT_CHECK函数将调用odbc_print_error函数打印出错误信息,并使用assert宏终止程序的执行。
代码如下:
SQLHDBC hdbc; rcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); ASSERT_CHECK(SQL_HANDLE_DBC, hdbc, rcode);连接数据源。
使用
SQLDriverConnect函数连接到指定的 ODBC 数据源,并通过ASSERT_CHECK函数检查连接操作的结果,确保连接成功。具体步骤如下:定义一个连接字符串
mydriver,用于描述连接到数据库所需的详细信息。该字符串包含了以下几个部分:Driver={OceanBase ODBC 2.0 Driver}:指定使用的 ODBC 驱动程序为 OceanBase ODBC 2.0 Driver。Server=your_ip:指定数据库服务器的 IP 地址。Port=your_port:指定连接数据库时使用的端口号。Database=your_schema:指定要连接的数据库名称。User=your_use:指定连接到数据库时使用的用户名。Password=your_password:指定连接到数据库时使用的密码。Option=3:指定连接选项,其值为3,表示使用 TCP/IP 连接。
使用
SQLDriverConnect函数连接到指定的 ODBC 数据源。函数执行后,返回一个 SQLRETURN 类型的值,指示函数的执行结果。在代码中,这个返回值被存储在 rcode 变量中。该函数的参数如下:hdbc:是 ODBC 连接句柄,用于与数据源建立连接。NULL:是一个保留参数,未使用。mydriver:是连接字符串,它包含连接数据库所需的所有信息,如驱动程序名称、数据库地址、端口号、数据库名称、用户名和密码等。strlen((char*)mydriver) + 1:是连接字符串的长度。OutConnStr:是一个用于存储连接字符串的SQLCHAR类型的缓冲区。255:是缓冲区的长度。&OutConnStrLen:是一个指向存储连接字符串实际长度的变量的指针。SQL_DRIVER_NOPROMPT:是一个连接标志,用于指示连接时不显示任何提示框。
ASSERT_CHECK函数被用于检查SQLDriverConnect函数的返回值rcode。如果rcode不是SQL_SUCCESS或SQL_SUCCESS_WITH_INFO,即连接失败,那么ASSERT_CHECK函数将调用odbc_print_error函数打印出错误信息,并使用assert宏终止程序的执行。
代码如下:
char* mydriver = (char*)"Driver={OceanBase ODBC 2.0 Driver};Server=your_ip;Port=your_port;Database=your_schema;User=your_use;Password=your_password;Option=3;"; rcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)mydriver, strlen((char*)mydriver) + 1, OutConnStr, 255, &OutConnStrLen, SQL_DRIVER_NOPROMPT); ASSERT_CHECK(SQL_HANDLE_DBC, hdbc, rcode);连接 OceanBase 数据库所需要的参数说明:
your_ip:提供 OceanBase 数据库连接 IP。ODP 连接方式使用的是一个 ODP 地址;直连方式使用的是 OBServer 节点的 IP 地址。your_port:提供 OceanBase 数据库连接端口。ODP 连接的方式默认是2883,在部署 ODP 时可自定义;直连方式默认是2881,在部署 OceanBase 数据库时可自定义。your_schema:需要访问的 Schema 名称。your_user:提供租户的连接账户。ODP 连接的方式格式:用户名@租户名#集群名或者集群名:租户名:用户名;直连方式格式:用户名@租户名。your_password:提供账户密码。
创建表。
通过
SQLAllocHandle函数分配一个 ODBC 语句句柄,然后使用SQLExecDirect函数执行一个 SQL 语句来创建一个表。代码还使用ASSERT_CHECK函数来检查句柄分配和语句执行的结果,确保操作成功。最后,使用SQLFreeHandle函数释放语句句柄,以释放资源。具体步骤如下:声明一个 ODBC 语句句柄
stmt。使用
SQLAllocHandle函数分配一个 ODBC 语句句柄。使用
ASSERT_CHECK函数检查SQLAllocHandle函数的返回值rcode,确保句柄分配成功。使用
SQLExecDirect函数执行一个 SQL 语句。在这里,它执行了一个CREATE TABLE语句来创建名为test_tbl1的表。使用
ASSERT_CHECK函数检查SQLExecDirect函数的返回值rcode,确保语句执行成功。使用
SQLFreeHandle函数释放ODBC语句句柄。
代码如下:
SQLHSTMT stmt; rcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &stmt); ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode); rcode = SQLExecDirect(stmt, (SQLCHAR*)"CREATE TABLE test_tbl1(id NUMBER PRIMARY KEY, name VARCHAR2(50),age NUMBER NOT NULL)", SQL_NTS); ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode); SQLFreeHandle(SQL_HANDLE_STMT, stmt);插入数据。
通过
SQLAllocHandle函数分配一个 ODBC 语句句柄,然后使用SQLExecDirect函数执行一个 SQL 语句向数据库表中插入数据。代码还使用ASSERT_CHECK函数来检查句柄分配和语句执行的结果,确保操作成功。最后,使用SQLFreeHandle函数释放语句句柄,以释放资源。具体步骤如下:使用
SQLAllocHandle函数分配一个 ODBC 语句句柄。使用
ASSERT_CHECK函数检查SQLAllocHandle函数的返回值rcode,确保句柄分配成功。使用
SQLExecDirect函数执行一个 SQL 语句。在这里,它执行了一个INSERT INTO语句,向test_tbl1表中插入三条记录。使用
ASSERT_CHECK函数检查SQLExecDirect函数的返回值rcode,确保语句执行成功。使用
SQLFreeHandle函数释放 ODBC 语句句柄。
代码如下:
rcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &stmt); ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode); rcode = SQLExecDirect(stmt, (SQLCHAR*)"INSERT INTO test_tbl1 (id,name,age) VALUES (1,'Tom', 18),(2,'Jerry', 20),(3,'Bob', 22)", SQL_NTS); ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode); SQLFreeHandle(SQL_HANDLE_STMT, stmt);查询数据。
通过
SQLAllocHandle函数分配一个 ODBC 语句句柄,然后使用SQLExecDirect函数执行一个 SQL 语句来获取结果集。接着,使用SQLBindCol函数将结果集的列绑定到变量上,然后使用SQLFetch函数逐行获取结果集。在while循环中,根据rcode的值打印出结果集中的数据。最后,使用SQLFreeHandle函数释放语句句柄,以释放资源。具体步骤如下:使用
SQLAllocHandle函数分配一个 ODBC 语句句柄。使用
ASSERT_CHECK函数检查SQLAllocHandle函数的返回值rcode,确保句柄分配成功。使用
SQLExecDirect函数执行一个 SQL 语句。在这里,它执行了一个SELECT语句,从test_tbl1表中检索所有行。使用
ASSERT_CHECK函数检查SQLExecDirect函数的返回值rcode,确保语句执行成功。声明一个
SQLLEN类型的变量res,用于存储绑定列操作的结果。声明两个
SQLINTEGER类型的变量id和age,用于存储结果集中对应列的值。声明一个
SQLCHAR类型的数组name,用于存储结果集中对应列的值。使用
SQLBindCol函数将结果集的第一列绑定到变量id上。使用
SQLBindCol函数将结果集的第二列绑定到数组name上。使用
SQLBindCol函数将结果集的第三列绑定到变量age上。使用
SQLFetch函数获取结果集的行,并将行中的数据存储到绑定的变量中。while循环会一直执行,直到所有行都被取完。在
while循环中,通过判断rcode的值,打印出对应行的数据。如果rcode为SQL_ERROR,则打印出错误信息。使用
SQLFreeHandle函数释放 ODBC 语句句柄。
代码如下:
rcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &stmt); ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode); rcode = SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM test_tbl1", SQL_NTS); ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode); SQLLEN res = SQL_NTS; SQLINTEGER id, age; SQLCHAR name[255]; SQLBindCol(stmt, 1, SQL_C_SLONG, &id, sizeof(id), &res); SQLBindCol(stmt, 2, SQL_C_CHAR, name, sizeof(name), &res); SQLBindCol(stmt, 3, SQL_C_SLONG, &age, sizeof(age), &res); while ((rcode = SQLFetch(stmt)) != SQL_NO_DATA_FOUND) { if (rcode == SQL_ERROR) { printf("sql error!\n"); } else { printf("id:%d, name:%s, age:%ld\n", id, name, age); } } SQLFreeHandle(SQL_HANDLE_STMT, stmt);清理工作, 释放具体的资源句柄。
断开与数据库的连接并释放相关的 ODBC 句柄和环境句柄,以释放资源。通过调用 SQLDisconnect 函数和 SQLFreeHandle 函数,程序可以正确地关闭与数据库的连接和释放相关句柄。最后,通过返回0表示程序执行成功。具体步骤如下:
使用 SQLDisconnect 函数断开与数据库的连接。
使用 SQLFreeHandle 函数释放数据库连接句柄。
使用 SQLFreeHandle 函数释放 ODBC 环境句柄。
返回 0,表示程序执行成功。
代码如下:
SQLDisconnect(hdbc); SQLFreeHandle(SQL_HANDLE_DBC, hdbc); SQLFreeHandle(SQL_HANDLE_ENV, henv); return 0;
完整的代码展示
#include <stdio.h>
#include <assert.h>
#include <windows.h>
#include <sql.h>
#include <sqlext.h>
static void odbc_print_error(SQLSMALLINT HandleType, SQLHANDLE Handle)
{
SQLCHAR SQLState[6];
SQLINTEGER NativeError;
SQLCHAR SQLMessage[SQL_MAX_MESSAGE_LENGTH] = { 0 };
SQLSMALLINT TextLengthPtr;
SQLGetDiagRec(HandleType, Handle, 1, SQLState, &NativeError, SQLMessage, SQL_MAX_MESSAGE_LENGTH, &TextLengthPtr);
fprintf(stdout, "[%s] (%d) %s\n", SQLState, NativeError, SQLMessage);
}
static void ASSERT_CHECK(SQLSMALLINT HandleType, SQLHANDLE Handle, SQLRETURN rcode)
{
if (rcode != SQL_SUCCESS && rcode != SQL_SUCCESS_WITH_INFO) {
odbc_print_error(HandleType, Handle);
assert(0);
}
}
int main()
{
HENV henv;
SQLCHAR OutConnStr[255];
SQLSMALLINT OutConnStrLen;
SQLRETURN rcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
ASSERT_CHECK(SQL_HANDLE_ENV, henv, rcode);
rcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);
ASSERT_CHECK(SQL_HANDLE_ENV, henv, rcode);
SQLHDBC hdbc;
rcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
ASSERT_CHECK(SQL_HANDLE_DBC, hdbc, rcode);
char* mydriver = (char*)"Driver={OceanBase ODBC 2.0 Driver};Server=your_ip;Port=your_port;Database=your_schema;User=your_use;Password=your_password;Option=3;";
rcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR*)mydriver, strlen((char*)mydriver) + 1, OutConnStr, 255, &OutConnStrLen, SQL_DRIVER_NOPROMPT);
ASSERT_CHECK(SQL_HANDLE_DBC, hdbc, rcode);
SQLHSTMT stmt;
rcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &stmt);
ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode);
rcode = SQLExecDirect(stmt, (SQLCHAR*)"CREATE TABLE test_tbl1(id NUMBER PRIMARY KEY, name VARCHAR2(50),age NUMBER NOT NULL)", SQL_NTS);
ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode);
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
rcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &stmt);
ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode);
rcode = SQLExecDirect(stmt, (SQLCHAR*)"INSERT INTO test_tbl1 (id,name,age) VALUES (1,'Tom', 18),(2,'Jerry', 20),(3,'Bob', 22)", SQL_NTS);
ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode);
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
rcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &stmt);
ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode);
rcode = SQLExecDirect(stmt, (SQLCHAR*)"SELECT * FROM test_tbl1", SQL_NTS);
ASSERT_CHECK(SQL_HANDLE_STMT, stmt, rcode);
SQLLEN res = SQL_NTS;
SQLINTEGER id, age;
SQLCHAR name[255];
SQLBindCol(stmt, 1, SQL_C_SLONG, &id, sizeof(id), &res);
SQLBindCol(stmt, 2, SQL_C_CHAR, name, sizeof(name), &res);
SQLBindCol(stmt, 3, SQL_C_SLONG, &age, sizeof(age), &res);
while ((rcode = SQLFetch(stmt)) != SQL_NO_DATA_FOUND)
{
if (rcode == SQL_ERROR) {
printf("sql error!\n");
}
else {
printf("id:%d, name:%s, age:%ld\n", id, name, age);
}
}
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_HANDLE_ENV, henv);
return 0;
}
相关文档
更多连接 OceanBase 数据库的信息,请参见 连接方式概述。
更多 OceanBase Connector/ODBC 的信息,请参见 OceanBase Connector/ODBC。
点击下载 c-oceanbase-odbc 示例工程