南大通用數據庫(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提供給程序調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章