本文介绍如何使用 Libkci 连接 Kingbase 数据库,并提供连接代码示例。
前提条件
-
确保已设置基本的应用开发环境。
-
确保已安装与驱动对应版本的数据库,且数据库连接可用。
-
确保 Libkci 支持开发环境:
-
系统架构:
Linux:x86_64、arm、loongarch、mips、sw
Windows:提供64位支持
-
编译器:
Linux:仅支持依赖glibc的编译器
Windows:依赖msvc120的运行时库
-
满足以上条件后,可通过金仓官网下载页(电科金仓-成为世界卓越的数据库产品与服务提供商)获取对应版本架构的libkci驱动。
操作实例
基于 Libkci 编译开发应用程序,下文以 Linux 环境使用 Libkci 连接数据库并执行简单的插入查询操作做示例说明,主要步骤如下:
下载并解压驱动包
解压 Libkci 对应版本的驱动包,驱动包内容如下所示:
Libkci ├── include │ ├── kingbase_ext.h │ ├── libkci │ │ └── libkci_fs.h │ ├── libkci_events.h │ ├── libkci_fe.h │ ├── sys_config_ext.h │ └── sys_config.h ├── libcrypto.so.1.1 ├── libkci.so └── libssl.so.1.1
复制
开发源程序
创建测试程序文件夹 test_libkci,将 Libkci 驱动包的头文件和库文件放置在指定目录,并创建源文件 test_libkci.c,示例目录结构如下:
test_libkci ├── include │ ├── kingbase_ext.h │ ├── libkci │ │ └── libkci_fs.h │ ├── libkci_events.h │ ├── libkci_fe.h │ ├── sys_config_ext.h │ └── sys_config.h ├── lib │ ├── libcrypto.so.1.1 │ ├── libkci.so │ └── libssl.so.1.1 └── test_libkci.c
复制
源码文件 test_libkci.c 中需要引用 Libkci 提供的头文件,如下所示:
#include <libkci_fe.h>
复制
使用 KCIConnectionCreate()
创建连接,判断连接状态:
char connInfo[] = "host=10.12.11.25 port=5033 user=system password=123456 dbname=test"; KCIConnection *conn = NULL; KCIResult *res = NULL; conn = KCIConnectionCreate(connInfo); if (KCIConnectionGetStatus(conn) != CONNECTION_OK) { fprintf(stderr, "KCIConnectionCreate error:[%s]", KCIConnectionGetLastError(conn)); if (res) KCIResultDealloc(res); KCIConnectionDestory(conn); exit(1); }
复制
使用 KCIStatementExecute()
执行SQL语句,执行完后需要手动执行 KCIResultDealloc()
销毁结果集的缓冲区:
KCIResult *res = NULL; res = KCIStatementExecute(conn, "create table testQuery (id int, val1 text, val2 text, val3 text, val4 text, val5 text, val6 text)"); KCIResultDealloc(res);
复制
使用 KCIResultGetRowCount()
和 KCIResultGetColumnCount()
遍历结果集,并打印对应列数据:
int i,j; KCIResult *res = NULL; for (i=0; i<KCIResultGetRowCount(res);i++) { for (j=0; j<KCIResultGetColumnCount(res); j++) { printf("| %s ", KCIResultGetColumnValue(res, i, j)); } printf("\n"); } KCIResultDealloc(res);
复制
完整用例如下:
#include <stdio.h> #include <stdlib.h> #include "libkci_fe.h" int main() { int i,j; /* 连接串 */ char connInfo[] = "host=127.0.0.1 port=54321 user=system password=123456 dbname=test"; KCIConnection *conn = NULL; KCIResult *res = NULL; conn = KCIConnectionCreate(connInfo); if (KCIConnectionGetStatus(conn) != CONNECTION_OK) { fprintf(stderr, "KCIConnectionCreate error:[%s]", KCIConnectionGetLastError(conn)); if (res) KCIResultDealloc(res); KCIConnectionDestory(conn); exit(1); } // 创建新表 res = KCIStatementExecute(conn, "drop table if exists testQuery"); KCIResultDealloc(res); res = KCIStatementExecute(conn, "create table testQuery (id int, val1 text, val2 text, val3 text, val4 text, val5 text, val6 text)"); KCIResultDealloc(res); // 执行插入 res = KCIStatementExecute(conn, "insert into testQuery values(0, '电科\', '金仓', '数据库', '000','000','000');insert into testQuery values(1, 'aaa','aaa','aaa','aaa','aaa','aaa');insert into testQuery values(2, 'bbb','bbb','bbb','bbb','bbb','bbb');"); KCIResultDealloc(res); // 执行查询 res = KCIStatementExecute(conn, "select * from testQuery"); // 打印结果集 for (i=0; i<KCIResultGetRowCount(res);i++) { for (j=0; j<KCIResultGetColumnCount(res); j++) { printf("| %s ", KCIResultGetColumnValue(res, i, j)); } printf("\n"); } KCIResultDealloc(res); KCIConnectionDestory(conn); return 0; }
复制
备注
数据库连接串需要根据实际情况填写,Libkci 支持两种形式的连接串格式:
- 键值对形式
"host=127.0.0.1 port=54321 user=system password=123456 dbname=test"
复制
- URL形式
"kingbase://user:secret@host:port/dbname" 例: "kingbase://system:123456@127.0.0.1:54321/test"
复制
编译
编写好源程序后,使用 gcc 编译,需要显示指定 Libkci 的头文件和库文件安装路径,以下是示例使用的 gcc 编译参数说明:
描述 | 参数 |
---|---|
编译指定头文件路径 | -I directory (directory 指定 Libkci 的头文件路径) |
编译指定库文件路径 | -L directory (directory 指定 Libkci 的库文件路径) |
编译指定链接库 | -lkci |
运行时优先搜索运行库路径 | -Wl,-rpath directory (directory 指定 Libkci 的库文件路径) |
完整的编译命令如下,以示例的目录结构为例:
gcc -I ./include -L ./lib test_libkci.c -o testLibkci -lkci -Wl,-rpath,./lib
复制
如果要编写make相关的文件,如makefile,需要向编译参数添加如下选项:
CPPFLAGS += -I (Libkci头文件所在目录) LDFLAGS += -L (Libkci库文件所在目录) LIBS += -lkci
复制
运行
编译后执行程序,命令行窗口会打印刚刚插入的数据,示例期望输出如下所示:
| 0 | 电科 | 金仓 | 数据库 | 000 | 000 | 000 | 1 | aaa | aaa | aaa | aaa | aaa | aaa | 2 | bbb | bbb | bbb | bbb | bbb | bbb
复制
常见问题
-
Linux环境运行测试程序报错无法找到libkci.so.5,报错如下:
./testLibkci: error while loading shared libraries: libkci.so.5: cannot open shared object file: No such file or directory
复制原因:Libkci 驱动包内可能没有提供 libkci.so.5 库,使用 Libkci 编译的应用程序运行时会依赖 libkci.so.5。
解决:将 libkci.so 拷贝复制一份为 libkci.so.5,或添加软链接,使应用程序运行时能正确找到 libkci.so.5 并加载依赖。
-
驱动包 SSL 库与系统环境的 SSL 库冲突
原因:系统环境的依赖库版本过高,或应用程序运行时错误加载了系统环境的SSL库。
解决:通过ldd 应用程序名,如
ldd testLibkci
查看当前环境下的依赖关系,确保运行应用程序时加载驱动包提供的 SSL 库,若仍然有 SSL 相关报错,则确定是驱动包提供的 SSL 库无法在当前环境下使用,此时请联系技服获取 Libkci 静态依赖 SSL 库的驱动包来解决 SSL 依赖冲突问题。 -
Windows 环境使用 Visual studio 编译Debug版本的应用程序崩溃
原因:当前默认提供的 Windows 驱动包是 Release 版本,使用 Debug 模式编译应用程序可能造成未知问题。
解决:请使用 Release 模式编译应用程序,如有需求,请联系技服申请 Debug 版本的 Libkci 驱动。