深度解析:基于 ODBC连接 KingbaseES 数据库的完整操作与实践
目录
- 引言
- 一、技术背景与前置准备
- 1.1 ODBC技术架构解析
- 1.2 KingbaseES ODBC 传输流程
- 1.3 环境配置要求
- 二、Linux 环境安装并部署驱动
- 2.1 unixOdbc 包下载
- 2.2 创建文件夹
- 2.3 配置 Odbc 数据源
- 2.4 测试 Odbc 驱动能否连接到数据库
- 三、程序源码开发
- 3.1 导入 unixOdbc 的头文件
- 3.2 初始化 Odbc 环境
- 3.3 连接数据库
- 3.4 创建测试表
- 3.5 插入数据
- 3.6 结果查询
- 3.7 释放资源
- 四、KingbaseES ODBC扩展连接属性
- 五、总结
引言
在当今企业级数据架构中,数据库的灵活连接能力直接决定了系统的扩展性和兼容性。KingbaseES作为国产数据库的佼佼者,其ODBC(Open Database Connectivity)接口为开发者提供了跨语言、跨平台的标准化连接方案。本文将深度拆解如何通过ODBC实现与KingbaseES的无缝对接,并完成从建表到数据操作的完整闭环,以真实可复现的代码案例快速掌握核心技术。
KingbaseES 数据库【系列篇章】:
No. | 文章地址(点击进入) |
---|---|
1 | 电科金仓KingbaseES数据库解析:国产数据库的崛起与技术创新 |
2 | KingBase数据库迁移利器:KDTS工具深度解析与实战指南 |
3 | KingBase数据库迁移利器:KDTS工具 MySQL数据迁移到KingbaseES实战 |
4 | 电科金仓KingbaseES V9数据库:国产数据库的自主创新与行业实践深度解析 |
5 | KingbaseES客户端工具Ksql使用全指南:从安装到高级操作 |
6 | Spring JDBC与KingbaseES深度集成:构建高性能国产数据库应用实战 |
一、技术背景与前置准备
1.1 ODBC技术架构解析
ODBC(开放数据库连接)提供了一套标准接口,使应用程序能够访问多种数据源。开发者无需为不同数据源重新编译应用程序代码。当应用程序需要访问特定数据源时,可通过调用相应的数据库驱动程序(动态链接库)实现连接。这种架构使得应用程序能够灵活访问所有支持ODBC的数据源。
1.2 KingbaseES ODBC 传输流程
KingbaseES ODBC 是一款基于标准 C 语言开发的 ODBC 驱动程序,完全兼容 Microsoft ODBC 3.5 及以上标准规范。该驱动程序支持应用程序实现以下核心功能:建立数据库连接、执行 SQL 语句、获取查询结果、检索状态及错误信息,以及管理事务和连接的生命周期。
1.3 环境配置要求
需要当前环境支持 Odbc 开发:
- Linux:请确认系统已安装
unixOdbc
组件 - Windows:系统默认自带 Odbc 支持
- 所有平台:需确保开发环境已配置 Odbc 功能
系统架构:
- Linux:支持 x86_64、ARM、LoongArch、MIPS 和 SW 架构
- Windows:V9 版本新增 64 位系统支持
编译器:
- Linux:仅兼容基于 glibc 的编译器
- Windows:需要 MSVC 2013 运行时库支持
满足上述条件后,可通过官方发布的数据库安装包、官网下载页的接口侧(https://www.kingbase.com.cn/download.html)下载与系统架构匹配的 ODBC 驱动程序
二、Linux 环境安装并部署驱动
2.1 unixOdbc 包下载
命令:
./configure --prefix=`pwd`/release
make
make install
安装完成后,通过一下命令查看版本
odbcinst --version
结果:
unixODBC 2.3.4
2.2 创建文件夹
接下来我们创建测试程序文件夹 test_odbc,后面的所有操作都在这个路径下面进行
目录:
test_odbc
├── lib
│ ├── kdbodbcw.so
│ ├── libcrypto.so.1.1
│ ├── libkci.so.5
│ ├── libodbcinst.so.2
│ └── libssl.so.1.1
├── Makefile
├── odbc.ini
├── odbcinst.ini
└── test_odbc.c
2.3 配置 Odbc 数据源
第一步:新建文件 odbcinst.ini
配置 odbcinst.ini 文件如下,其中创建了一个名为 kdbodbc test driver 的驱动配置项,通过 Driver 参数指定了 Odbc 驱动的具体路径:
[kdbodbc test driver]
Description = KingbaseES ODBC driver (Unicode version), for regression tests
Driver = /home/kingbase/test_odbc/lib/kdbodbcw.so
第二步:新建文件 odbc.ini
配置 odbc.ini 文件如下,创建名为 KingbaseES 的 ODBC 数据源配置,其中驱动程序路径指向 kdbodbc test driver,该配置文件用于设置 ODBC 连接参数和相关配置信息:
[KingbaseES]
Description = kdbodbc regression test DSN
Driver = kdbodbc test driver
Servername = 127.0.0.1
Port = 54321
Username = system
Password = 123456
Database = test
修改配置文件后,将配置路径添加到当前命令行窗口的环境变量,即可让 unixOdbc 正确识别 Odbc 驱动配置。
下面以当前目录下的 odbcinst.ini 和 odbc.ini 文件为例,演示如何将其添加到环境变量中:
export ODBCSYSINI=.
export ODBCINSTINI=./odbcinst.ini
export ODBCINI=./odbc.ini
配置完成后,通过 odbcinst -j 查看信息进行验证:
unixODBC 2.3.4
DRIVERS............: ./
SYSTEM DATA SOURCES: ./odbc.ini
FILE DATA SOURCES..: ./ODBCDataSources
USER DATA SOURCES..: ./odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
2.4 测试 Odbc 驱动能否连接到数据库
使用 unixOdbc
的 isql DSNName
命令可以快速测试驱动是否成功加载并验证数据库连接状态
$ isql KingbaseES
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
三、程序源码开发
3.1 导入 unixOdbc 的头文件
#include "sql.h"
#include "sqlext.h"
3.2 初始化 Odbc 环境
通过 SQLAllocHandle() 函数创建 SQLHENV 环境句柄实例,成功创建后,再调用 SQLSetEnvAttr() 函数对该环境句柄进行属性设置
SQLHENV hEnv;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);
SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
3.3 连接数据库
通过 SQLAllocHandle() 函数创建 SQLHDBC 实例后,调用 SQLConnect() 方法建立数据库连接。
SQLHDBC hDbc;
SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);
// SQLConnect(hDbc, DSN, SQL_NTS, user, SQL_NTS, password, SQL_NTS)
SQLConnect(hDbc, (SQLCHAR*)"KingbaseES", SQL_NTS, (SQLCHAR*)"system", SQL_NTS, (SQLCHAR*)"123456", SQL_NTS);
3.4 创建测试表
通过 SQLAllocHandle() 创建 SQLHSTMT 句柄后,可使用 SQLExecDirect() 直接执行建表 SQL 语句,无需进行参数绑定操作
SQLHSTMT hStmt;const char *sqlDropTb = "drop table if exists test_odbc;";
const char *sqlCreateTb = "create table test_odbc (id int, name varchar(100));";// 创建表
SQLAllocHandle(SQL_HANDLE_STMT, hDbc, &hStmt);SQLExecDirect(hStmt, (SQLCHAR*)sqlDropTb, SQL_NTS);
SQLExecDirect(hStmt, (SQLCHAR*)sqlCreateTb, SQL_NTS);
3.5 插入数据
要插入数据,首先通过SQLPrepare()创建预处理语句,然后使用SQLBindParameter()绑定参数值,最后调用SQLExecute()执行操作
const char *sqlInsertTb = "insert into test_odbc values (?, ?)";
SQLINTEGER inId = 1;
SQLCHAR inName[] = "KKKingbase";SQLPrepare(hStmt, (SQLCHAR*)sqlInsertTb, SQL_NTS);SQLBindParameter(hStmt, 1, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &inId, 0, NULL);
SQLBindParameter(hStmt, 2, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_VARCHAR, 100, 0, inName, 0, NULL);SQLExecute(hStmt);
3.6 结果查询
SQLRETURN ret;
const char *sqlSelectTb = "select * from test_odbc";
SQLINTEGER outId;
SQLCHAR outName[100];SQLExecDirect(hStmt, (SQLCHAR*)sqlSelectTb, SQL_NTS);// 绑定查询结果
SQLBindCol(hStmt, 1, SQL_C_LONG, &outId, 0, NULL);
SQLBindCol(hStmt, 2, SQL_C_CHAR, outName, sizeof(outName), NULL);// 获取查询结果并打印
while ((ret = SQLFetch(hStmt)) != SQL_NO_DATA) {if (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO) {printf("ID: %d, Name: %s\n", outId, outName);} else {CHECK_ERROR(ret, hStmt, SQL_HANDLE_STMT);}
}
3.7 释放资源
SQLFreeHandle(SQL_HANDLE_STMT, hStmt);
SQLDisconnect(hDbc);
SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
SQLFreeHandle(SQL_HANDLE_ENV, hEnv);
四、KingbaseES ODBC扩展连接属性
在连接串中处理必须设定的连接属性有Driver,Servername,Port,Username(UID),Password(PWD),Database,在设置上述六个属性值时应避免包含没有用大括号“”包围的字符“[] (),;?=*!@”。更多SQLDriverConnect()方法的调用,参考疑难解答部分的内容。其中,需要注意的是连接串中关键字的大小写。
配置的选项值将应用于该连接上的所有语句,但部分选项可通过设置连接属性或语句属性进行覆盖。这种情况下,原设定值将被新设置的选项值取代。具体连接属性下图列出:
五、总结
本文通过完整的技术解析和实操案例,展示了如何通过ODBC连接KingbaseES数据库并完成基本数据操作。从环境配置到高级调优,每个环节都提供了可复现的代码示例和最佳实践建议。掌握这些技术不仅能帮助开发者快速构建企业级应用,更能深入理解数据库连接的本质原理。
博主使用感受:在国产化数据库快速发展的今天,KingbaseES凭借其高性能、高兼容性的ODBC接口,正在成为越来越多企业数据库迁移和新建项目的首选。技术探索永无止境,愿每位开发者都能在数据库连接的道路上越走越远,创造出更多价值。