一、环境搭建。 1:确保南大通用数据库处于开启状态。 可以使用命令 netstat -nptal
二、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,×tamp_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提供给程序调用。
|