3.5. C++语言使用GBase Object Interface for C++方式连接到数据库(Linux)

本章节将介绍C++程序通过GBase Object Interface for C++连接到GBase 8s数据库的方式。
GBase Object Interface for C++依赖于CSDK。

3.5.1. 示例环境介绍

操作系统:Ubuntu 22.04.3 LTS (x86_64)
数据库版本:GBase 8s v8.8_3.6.3_3x2_1

3.5.2. 依赖包

root@netsky:~# apt -y install autoconf gcc g++

3.5.3. 安装GBase ClientSDK及配置ODBC

安装目录为/opt/gbase
参考:CSDK安装

在/etc/ld.so.conf.d目录下增加GBase 8s的库目录配置文件gbase8scsdk-x86_64.conf

root@netsky:/etc/ld.so.conf.d# pwd
/etc/ld.so.conf.d
root@netsky:/etc/ld.so.conf.d# more gbase8scsdk-x86_64.conf
/opt/gbase/lib
/opt/gbase/lib/cli
/opt/gbase/lib/esql

设置环境变量(与server一致),并加载

root@netsky:~# more env_csdk
export GBASEDBTSERVER=gbase01
export GBASEDBTDIR=/opt/gbase
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

root@netsky:~# . env_csdk

3.5.4. 设置系统网络连接(异机:可选,也可配置为信任连接方式)

在用户目录下创建.netrc配置文件,权限为600,内容如下:

root@netsky:~/cpp# more ~/.netrc
# machine 目标主机名或IP地址 login 用户名 password 密码
machine 192.168.0.212 login gbasedbt password GBase123$%

3.5.5. GBase Object Interface for C++连接测试

3.5.5.1. 编译测试程序TestCpp.cpp

TestCpp.cpp内容如下,参考demo/c++/queryrex.cpp:

#include <iostream>
#include <it.h>
#include <string>
using namespace std;
 
int main(int argc, char *argv[])
{
    if (argc != 1)
        {
        cout << "Usage: " << argv[0]  << endl;
        return 1;
        }
 
    // 指定数据库
    ITConnection conn;
    conn.SetDBInfo(ITDBInfo(ITString("testdb")));
    conn.Open();
 
    // 创建query对象
    ITQuery q(conn);
 
    if (argc != 1)
        {
        cout << "Usage:./TestCpp" << endl;
    	conn.Close();
    	return 0;
        }
    // 检查表是否存在,如果不存在则创建
    q.ExecForStatus("drop table if exists company;");
    cout << "删除表: \n";

    ITRow *r1 = q.ExecOneRow(
        "select 1 from systables where tabname = 'company';");
    if ( !r1 && (!q.ExecForStatus("create table company(coid serial,coname varchar(255),coaddr varchar(255), primary key(coid))")))
    {
        cerr << "创建表 company 失败!" << endl;
        return 1;
    }
    cout << "创建表: \n";

    // 开始事务  
    conn.SetTransaction(ITConnection::Begin);

    // 插入数据
    ITString query;
    query = "insert into company values (0,'GBase','TJ'),(0,'GBase Beijin','BJ');";
    q.ExecForStatus(query);
    cout << "插入表: \n";

    // 提交事务
    conn.SetTransaction(ITConnection::Commit);

    // 显示数据库中的内容
    cout << "查询表:\n";
    ITSet *set = q.ExecToSet
        ("select * from company;"); 
    if( !set )
    {
	    cout << "查询失败!" << endl;
	    conn.SetTransaction(ITConnection::Abort);
	    conn.Close();
	    return -1;
    }
    ITValue *v;
    while ((v = set->Fetch()) != NULL)
    {
        cout << v->Printable() << endl;
        v->Release();
    } 
    set->Release();
    cout << endl;
    conn.Close();
    return 0;
}

3.5.5.2. 编写Makefile

Makefile文件内容:

CPPIFDIR	= $(GBASEDBTDIR)
CCHOME		= /usr
 
CCPP		= $(CCHOME)/bin/g++
CCPLUS		= $(CCPP) $(HEADEROPTS)
CCPPFLAGS 	= -I$(GBASEDBTDIR)/incl/dmi -I$(GBASEDBTDIR)/incl \
	-I$(GBASEDBTDIR)/incl/esql
CCPLINK		= $(CCPLUS) $(CCFLAGS) $(CCPPFLAGS)
CC		= $(CCHOME)/bin/gcc
C-COMPILE-FLAGS	= $(CCFLAGS)
CCDEFS		= -DLINUX -DIT_HAS_DISTINCT_LONG_DOUBLE \
	-DIT_COMPILER_HAS_LONG_LONG -DIT_DLLIB -DMITRACE_OFF -fPIC
CCFLAGS		= -g $(CCDEFS) -fsigned-char
 
ESQL		= $(GBASEDBTDIR)/bin/esql
 
RANLIB		= echo
 
LOCALINCL	= -I$(CPPIFDIR)/incl/c++
 
LIBS_SYSTEM	= -lm -ldl -lcrypt -lnsl
LIBS_ESQL	= -L$(GBASEDBTDIR)/lib/esql -L$(GBASEDBTDIR)/lib -lifsql \
 -lifasf -lifgen -lifos -lifgls -lifglx $(GBASEDBTDIR)/lib/esql/checkapi.o
LIBS_LIBMI	= -L$(GBASEDBTDIR)/lib/dmi -lifdmi 
LIBS_CPPIF	= -L$(CPPIFDIR)/lib/c++ -lifc++
LIBS		= $(LIBS_CPPIF) $(LIBS_LIBMI) $(LIBS_ESQL) $(LIBS_SYSTEM) 
RPATH		= $(GBASEDBTDIR)/lib:$(GBASEDBTDIR)/lib/esql:$(GBASEDBTDIR)/lib/dmi:$(GBASEDBTDIR)/lib/c++
 
PROGRAMS	= TestCpp
.SUFFIXES: .cc .o .hdr .cpp
 
.cc.o:
	@rm -f $@
	$(CCPLUS) $(CCFLAGS) $(LOCALINCL) $(CCPPFLAGS) -c $<
 
.cpp.o:
	@rm -f $@
	$(CCPLUS) $(CCFLAGS) $(LOCALINCL) $(CCPPFLAGS) -c $<
 
all: 	$(PROGRAMS)
 
TestCpp: TestCpp.o
	$(CCPLINK) -o TestCpp TestCpp.o $(SUBSYSTEMS.link) $(LIBS) -Wl,-rpath=$(RPATH)
 
clean:
	$(RM) *.o $(PROGRAMS) core

注:使用tab而不是8个空格

3.5.5.3. 编译

编译,生成TestCpp

root@netsky:~/cpp# make

3.5.5.4. 执行测试

执行测试

root@netsky:~/cpp# ./TestCpp
删除表:
创建表:
插入表:
查询表:
1       GBase   TJ
2       GBase Beijin    BJ

最后更新日期: 2025-08-22