南大通用数据库使用代码操作数据库。GBase ODBC 应用开发

上一篇文章:https://blog.csdn.net/qd1308504206/article/details/104253107

代码示例。

/**
descript: 纯 C 下用 ODBC 访问数据库。
date: 2010.12.9
notes: gcc gs_odbc.c -o gs_odbc -lgsodbc8 -L/home/gbase/opt/GBase/GSODBC/lib
需要 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

发布了20 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qd1308504206/article/details/104253689