南大通用数据库(3): 安装ODBC驱动。和Linux上代码运行调试。

一、环境搭建。

1:确保南大通用数据库处于开启状态。

可以使用命令 netstat -nptal

或者命令

ps -aux | grep gbase

 

二、Centos7.6机器上安装ODBC驱动

默认情况下会提示 sql.h 文件找不到。

因为下面代码中需要引用sql.h 和sqlert.h 所以需要安装。

yum install unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel

 

三、测试代码编写和编译运行

代码示例。存为文件名: gs_odbc.c

/**
descript: 纯 C 下用 ODBC 访问数据库。
date: 2010.12.9
notes: gcc gs_odbc.c -o gs_odbc -lgsodbc8 -L /opt/GBase/ODBC/
需要 libgsodbc8-8.3.81.51.so
**/
#ifndef _GBASE_C_ODBC_H
#define _GBASE_C_ODBC_H
/** 包含文件 **/
#include <stdio.h>
#include <sql.h>
#include <sqlext.h>
/** 简单的宏,用于判断 ODBCAPI 的执行结果是否正确 **/
#define isSuc(result) ((result) == SQL_SUCCESS || (result) == SQL_SUCCESS_WITH_INFO)
/** 可扩展设置 **/
char szConnectString[1024] = "Driver={GBase ODBC 8.3 Driver};Server=localhost;Port=5258;Database=xiaobo;User=sysdba;Password=********;SOCKET=/opt/GBase/Server/tmp/gbase.sock;Option=3;";
//char szConnectString[1024] = "DSN=gbaseodbc;";//Server=localhost;Port=5258;Database=test;Option=3;";
char szSQL1[1024] = "DROP TABLE IF EXISTS test_c";
char szSQL2[1024] = "CREATE TABLE test_c(ID int not null primary key, NAME varchar(20),DATE date, TIME time, Timestamp timestamp, TEXT text)";
char szSQL3[1024] = "INSERT INTO test_c VALUES(0,'AAA','2010-12-09','12:12:12','2010-12-09 12:12:12','ABC')";
char szSQL4[1024] = "SELECT * FROM test_c";
/** 输出缓存 **/
char szDriverOutput[256];
short sDriverOutputLength;
/** 用于测试的变量 **/
int id_r = 0;
char name_r[255];
char date_r[255];
char time_r[255];
char timestamp_r[255];
char text_r[255];
long temp = 0;
/** 用于测试的主函数 **/
int main(){
short sret; //返回代码
void* henv; //环境句柄
void* hdbc; //连接句柄
long mode;//提交模式
void* hsmt; //语句句柄
/** 申请环境句柄 **/
sret = SQLAllocHandle(SQL_HANDLE_ENV,SQL_NULL_HANDLE,&henv);
if(!isSuc(sret))printf("申请环境句柄出错\n");
/** 设置环境属性,声明 ODBC 版本 **/
sret = SQLSetEnvAttr(henv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,SQL_IS_INTEGER);
if(!isSuc(sret))printf("声明 ODBC 版本出错\n");
/** 申请连接句柄 **/
sret = SQLAllocHandle(SQL_HANDLE_DBC,henv,&hdbc);
if(!isSuc(sret))printf("申请连接句柄出错\n");
/** 设置连接属性 **/
sret = SQLSetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(void*)SQL_AUTOCOMMIT_OFF,SQL_IS_INTEGER);
if(!isSuc(sret))printf("设置连接属性出错\n");
/** 取得连接属性 **/
sret = SQLGetConnectAttr(hdbc,SQL_ATTR_AUTOCOMMIT,(void*)&mode,sizeof(mode) +
1,NULL);
if(!isSuc(sret))printf("取得连接属性出错\n");
/** 连接数据源 **/
sret = SQLDriverConnect(hdbc,NULL,(unsigned char
*)szConnectString,SQL_NTS,(unsigned char
*)szDriverOutput,256,&sDriverOutputLength,SQL_DRIVER_NOPROMPT);
if(!isSuc(sret))printf("连接数据源出错\n");
/** 分配语句句柄 **/
sret = SQLAllocHandle(SQL_HANDLE_STMT,hdbc,&hsmt);
if(!isSuc(sret))printf("分配语句句柄出错\n");
/** 执行语句 **/
sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQL1,SQL_NTS);
if(!isSuc(sret))printf("执行 DROP TABLE 语句出错\n");
sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQL2,SQL_NTS);
if(!isSuc(sret))printf("执行 CREATE TABLE 语句出错\n");
sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQL3,SQL_NTS);
if(!isSuc(sret))printf("执行 INSERT 语句出错\n");
sret = SQLExecDirect(hsmt,(SQLCHAR *)szSQL4,SQL_NTS);
if(!isSuc(sret))printf("执行 SELECT 语句出错\n");
/** 绑定结果集和获得数据 **/
SQLBindCol(hsmt,1,SQL_C_LONG,&id_r,sizeof(id_r),&temp);
SQLBindCol(hsmt,2,SQL_C_CHAR,&name_r,sizeof(name_r),&temp);
SQLBindCol(hsmt,3,SQL_C_CHAR,&date_r,sizeof(date_r),&temp);
SQLBindCol(hsmt,4,SQL_C_CHAR,&time_r,sizeof(time_r),&temp);
SQLBindCol(hsmt,5,SQL_C_CHAR,&timestamp_r,sizeof(timestamp_r),&temp);
SQLBindCol(hsmt,6,SQL_C_CHAR,&text_r,sizeof(text_r),&temp);
/** 取得数据 **/
while(1){
/** 滚动游标 **/
sret = SQLFetchScroll(hsmt,SQL_FETCH_NEXT,0);
/**
前面如果发生错误,这里很可能得不到 SQL_NO_DATA_FOUND 而发生死循环,
所以不用 SQL_NO_DATA_FOUND 来判断,而用 SQL_SUCCESS 来判断,但这句在杂复的程
序中里依然有用。
**/
//if (sret == SQL_NO_DATA_FOUND) break; //如果没有数据就中断。
if (sret != SQL_SUCCESS) break;
printf("id = %d\r\n",id_r);
printf("name = %s\r\n",name_r);
printf("date = %s\r\n",date_r);
printf("time = %s\r\n",time_r);
printf("timestamp = %s\r\n",timestamp_r);
printf("text = %s\r\n",text_r);
}
/** 释放语句句柄 **/
SQLFreeHandle(SQL_HANDLE_STMT,hsmt);
/** 提交连接的事务 **/
SQLEndTran(SQL_HANDLE_DBC,hdbc,SQL_COMMIT);
/** 断开与数据源的连接 **/
SQLDisconnect(hdbc);
/** 释放连接句柄 **/
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
/** 释放环境句柄 **/
SQLFreeHandle(SQL_HANDLE_ENV,henv);
}
#endif

在运行的时候,需要提供libgsodbc8-8.3.81.51.so提供给程序调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值