暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用 Libkci 连接金仓数据库kingbase

数据猿 2025-03-21
47

 

本文介绍如何使用 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
复制

常见问题

  1. 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 并加载依赖。

  2. 驱动包 SSL 库与系统环境的 SSL 库冲突

    原因:系统环境的依赖库版本过高,或应用程序运行时错误加载了系统环境的SSL库。

    解决:通过ldd 应用程序名,如 ldd testLibkci 查看当前环境下的依赖关系,确保运行应用程序时加载驱动包提供的 SSL 库,若仍然有 SSL 相关报错,则确定是驱动包提供的 SSL 库无法在当前环境下使用,此时请联系技服获取 Libkci 静态依赖 SSL 库的驱动包来解决 SSL 依赖冲突问题。

  3. Windows 环境使用 Visual studio 编译Debug版本的应用程序崩溃

    原因:当前默认提供的 Windows 驱动包是 Release 版本,使用 Debug 模式编译应用程序可能造成未知问题。

    解决:请使用 Release 模式编译应用程序,如有需求,请联系技服申请 Debug 版本的 Libkci 驱动。

  

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论