一、概述
本文以示例的形式介绍Linux下C通过ESQL/C的方式操作GBase 8s数据库的方法。
示例使用的数据库版本为GBase8sV8.8_TL_3.5.1_3X1_x86_64,CSDK 的版本为clientsdk_3.5.1_3X1_x86_64(Linux)。
示例使用的数据库服务器信息如下:
表 1 示例使用的数据库信息
序号 | 参数名称 | 示例参数值 | 说明信息 |
1 | 主机名称 | 192.168.137.66 | 数据库服务器的主机名或IP地址 |
2 | 端口号 | 6666 | 数据库服务器使用的端口号 |
3 | 数据库服务名 | yangzai | 数据库服务名称(DBSERVERNAME) |
4 | 数据库名称 | testzh | 数据库名称(DBNAME) |
5 | 数据库字符集 | zh_CN.utf8 | 数据库字符集(DB_LOCALE) |
6 | 客户端字符集 | zh_CN.utf8 | 客户端字符集(CLIENT_LOCALE) |
7 | GLU支持 | 1 | GLU支持(GL_USEGLU) |
数据库及CSDK的下载地址:
https://www.gbase.cn/download/gbase-8s-1?category=INSTALL_PACKAGE
二、GBase 8s ESQL/C介绍
GBase 8s ESQL/C 是 SQL 应用程序编程接口(API),它使你可以直接在 C 程序中嵌入结构化查询语言(SQL)语句。
GBase 8s ESQL/C 的预处理器 esql 将每个 SQL 语句和特定于 GBase 8s 的所有代码转换为 C 语言源代码,并启动 C 编译器进行编译它。
GBase 8s ESQL/C 由以下软件组件构成:
- C 函数的 GBase 8s ESQL/C 库,用于访问数据库服务器。
- GBase 8s ESQL/C 头文件,提供数据结构、常量以及对 GBase 8s ESQL/C 程序有用的宏定义。
- esql 命令,它处理 GBase 8s ESQL/C 源代码以创建一个 C 源文件,并将它传递给 C 编译器。
- finderr 实用程序(在 UNIX 系统上)用于获得特定于 GBase 8s 的错误消息的信息。
- GBase 8s GLS 语言环境和代码集转换文件,此文件提供了特定语言环境的信息。
GBase 8s ESQL/C 库包含一组可用于应用程序的 C 函数。
这些函数可以归为以下几类:
- 数据类型对齐库函数为不同数据类型的计算机独立大小和对齐信息提供支持,并协助处理空数据库值。
- 字符和字符串库函数提供基于字符的操作,例如比较和复制。
- DECIMAL 库函数支持通过十进制结构访问 DECIMAL 值。
- 格式化函数使您指定不同数据类型的显示格式。
- DATE 库函数支持存取 DATE 值。
- DATETIME 和 INTERVAL 库函数支持存取通过 datetime 和 interval 结构的值。
- 错误消息函数为获取和格式化特定于GBase 8s的错误消息文本提供支持。
- 数据库服务器控制函数使您的应用程序实现例如撤销查询和终止连接的功能。
- INT8 库函数使您能够通过 int8 结构存取 INT8 值。
- 智能大对象库函数提供类似于 BLOB 和 CLOB 数据类型的文件。
下图说明了 GBase 8s ESQL/C 程序成为可执行程序的过程。
要从GBase 8s ESQL/C源文件创建可执行C程序,请使用esql命令。在使用esql之前,请确保:
- GBase 8s ESQL/C源文件的文件名称具有.ec扩展名。如果希望在 GBase 8s ESQL/C预处理器执行之前运行C预处理器,可以使用.ecp扩展名。
- 已正确设置GBASEDBTDIR环境变量和包含GBASEDBTDIR目录的BIN目录的路径(在UNIX操作系统中是$GBASEDBTDIR/bin)PATH 环境变量。
三、Linux下的CSDK安装及连接配置
1、安装CSDK
CSDK需要使用root用户权限进行安装。需要预先创建gbasdbt用户组及 gbasedbt用户。
1)、创建 gbasedbt 用户组及 gbasedbt 用户
groupadd -g 1000 gbasedbt
useradd -g 1000 -d /home/gbasedbt -m -s /bin/bash gbasedbt
2)、解压缩 CSDK 软件包
mkdir csdk
cd csdk/
tar -xf ../clientsdk_3.5.1_3X1_x86_64.tar
3)、执行静默安装,自动完成安装
./installclientsdk -i silent -DUSER_INSTALL_DIR=/opt/gbase -DLICENSE_ACCEPTED=TRUE
表2 Linux 下 CSDK 安装涉及的参数说明
序号 | 参数名称 | 示例参数值 | 说明信息 |
1 | -i | silent | 指定使用静默安装 |
2 | -DUSER_INSTALL_DIR | /opt/gbase | 指定安装目录 |
3 | -DLICENSE_ACCEPTED | TRUE | 指定接受协议 |
2、配置CSDK
CSDK 安装完成后,需要对客户端连接进行设置。以下使用 gbasedbt 用户来说明。
1)、根据数据库的实现情况设置相应的环境变量
export GBASEDBTDIR=/opt/gbase
export GBASEDBTSERVER=yangzai
export PATH=${GBASEDBTDIR}/bin:${PATH}
export LD_LIBRARY_PATH=$GBASEDBTDIR/lib:$GBASEDBTDIR/lib/cli:$GBASEDBTDIR/lib/esql:$LD_LIBRARY_PATH
export DB_LOCALE=zh_CN.utf8
export CLIENT_LOCALE=zh_CN.utf8
export GL_USEGLU=1
2)、修改 GBASEDBTSQLHOSTS 配置文件
yangzai onsoctcp 192.168.137.66 6666
四、ESQL/C代码示例
#include <stdio.h>
EXEC SQL define NAME_LEN 20;EXEC SQL define ADDRESS_LEN 200;
main()
{
EXEC SQL BEGIN DECLARE SECTION;
int rnum;
int snum;
char sname[ NAME_LEN + 1 ];
char saddress[ ADDRESS_LEN + 1 ];
EXEC SQL END DECLARE SECTION;
EXEC SQL WHENEVER ERROR STOP;
EXEC SQL connect to 'testzh';
//drop table
EXEC SQL drop table if exists tab2;
printf("Drop table successfully.\n\n");
//create table
EXEC SQL create table tab2 (num int, name char(20), address varchar2(200));
printf("Create table successfully.\n\n");
//insert without using host variables
EXEC SQL insert into tab2 values (1, "Jack", "Beijing");
printf("Insert (without using host variables) successfully.\n\n");
//insert with using host variables
snum = 2;
sprintf(sname, "Mary");
sprintf(saddress, "Shanghai");
EXEC SQL insert into tab2 values (:snum, :sname, :saddress);
printf("Insert (with using host variables) successfully.\n\n");
//use a static sql statement to select data
EXEC SQL declare mycursor1 cursor for
select num, name, address from tab2;
EXEC SQL open mycursor1;
printf("The output of the first select statement:\n");
for (;;)
{
EXEC SQL fetch mycursor1 into :snum, :sname, :saddress;
if (strncmp(SQLSTATE, "00", 2) != 0)
break;
printf("%d %s %s\n", snum, sname, saddress);
}
if (strncmp(SQLSTATE, "02", 2)!=0)
printf("SQLSTATE after fetch is %s\n", SQLSTATE);
EXEC SQL close mycursor1;
EXEC SQL free mycursor1;
//use a dynamic sql statement to select data
EXEC SQL prepare mystmt from "select num, name, address from tab2 where num = ?";
EXEC SQL declare mycursor2 cursor for mystmt;
rnum = 2;
EXEC SQL open mycursor2 using :rnum;
printf("\nThe output of the second select statment:\n");
for (;;)
{
EXEC SQL fetch mycursor2 into :snum, :sname, :saddress;
if (strncmp(SQLSTATE, "00", 2) != 0)
break;
printf("%d %s %s\n", snum, sname, saddress);
}
if (strncmp(SQLSTATE, "02", 2) != 0)
printf("SQLSTATE after fetch is %s\n", SQLSTATE);
EXEC SQL close mycursor2;
EXEC SQL free mystmt;
EXEC SQL free mycursor2;
EXEC SQL disconnect current;
exit(0);
} 五、程序运行结果
将上面示例代码复制到Demo.ec文件中,编译成可执行文件后,执行测试连接到数据库结果。




