本文介绍如何使用 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 驱动。