Linux下C通过ESQL/C方式连接南大通用GBase 8s数据库

53 阅读4分钟

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。

在 Linux 环境中,使用 C 语言通过 ESQL/C 方式连接 GBase 8s 数据库是常见的开发需求。本文将详细介绍如何在 Linux 下通过 ESQL/C 连接 GBase 8s 数据库,包括环境搭建、代码编写、编译和运行等步骤。

ESQL/C 是一种允许在 C 程序中嵌入 SQL 语句的技术。通过 ESQL/C,开发者可以在 C 程序中直接操作数据库,实现数据的增删改查等功能。本文将通过一个完整的示例,展示如何在 Linux 下使用 ESQL/C 连接 GBase 8s 数据库。

环境准备

(一)数据库信息

以下是示例中使用的数据库服务器信息:

 

参数名称 示例参数值 说明信息  
主机名称192.168.137.66数据库服务器的主机名或 IP 地址
端口号6666数据库服务器使用的端口号
数据库服务名yangzai数据库服务名称(DBSERVERNAME)
数据库名称testzh数据库名称(DBNAME)
数据库字符集zh_CN.utf8数据库字符集(DB_LOCALE)
客户端字符集zh_CN.utf8客户端字符集(CLIENT_LOCALE)
GLU支持1GLU支持(GL_USEGLU)

 

GBase 8s ESQL/C 介绍

GBase 8s ESQL/C 是一个 SQL 应用程序编程接口(API),允许在 C 程序中嵌入 SQL 语句。ESQL/C 的预处理器esql 将 SQL 语句转换为 C 语言源代码,并启动 C 编译器进行编译。

 

ESQL/C 由以下组件构成:

GBase 8s ESQL/C 库:提供用于访问数据库服务器的 C 函数。

ESQL/C 头文件:提供数据结构、常量和宏定义。

esql 命令:处理 ESQL/C 源代码以创建 C 源文件,并将其传递给 C 编译器。

finderr 实用程序:在 UNIX 系统上用于获取 GBase 8s 的错误消息。

GLS 语言环境和代码集转换文件:提供特定语言环境的信息。

Linux 下的 CSDK 安装及配置

(一)安装 CSDK

1、创建用户组和用户

• 创建 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

 

(二)配置 CSDK

1、设置环境变量

• 以 gbasedbt 用户身份登录,并设置以下环境变量:

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 代码示例

以下是一个完整的 ESQL/C 示例代码,展示如何连接到 GBase 8s 数据库并执行一些基本操作。

示例代码

#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 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 statement:\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);
}

编译和运行

1、将代码保存为Demo.ec文件。

2、使用esql命令编译:

  esql Demo.ec

3、编译生成的 C 文件:

  gcc -o Demo Demo.c -I${GBASEDBTDIR}/include -L${GBASEDBTDIR}/lib -lcli

4、运行程序:

  ./Demo

 

程序运行结果

运行上述程序后,你将看到以下输出:

Drop table successfully.
Create table successfully.
Insert (without using host variables) successfully.
Insert (with using host variables) successfully.
The output of the first select statement:
1 Jack Beijing
2 Mary Shanghai
The output of the second select statement:
2 Mary Shanghai

 

通过本文的介绍,相信您已经了解了如何在 Linux 下通过 ESQL/C 连接 GBase 8s 数据了。

原文链接:www.gbase.cn/community/p…
更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。