example分享
鏈接:https://pan.baidu.com/s/1dRjSCMvJ5xkwPX7baOpxLA
提取碼:7ikk
一、示例1:測試Cursors.cpp
/*
*GBase數據庫示例
*本示例主要演示了遊標的使用
*數據庫用戶名:sysdba 密碼:1 數據庫:northwind 服務器:localhost
*/
#include <exception>
#include <windows.h>
#include <sql.h>
#include <stdio.h>
#include <sqlext.h>
#include <stdlib.h>
#include <mbstring.h>
#include <iostream.h>
#define MAX_DATA 100
#define GBASESUCCESS(rc) ((rc==SQL_SUCCESS)||(rc==SQL_SUCCESS_WITH_INFO))
class direxec
{
RETCODE rc; // ODBC return code
HENV henv; // Environment 句柄
HDBC hdbc; // Connection 句柄
HSTMT hstmt; // Statement 句柄
unsigned char szData[MAX_DATA]; // 返回的數據
SDWORD cbData; // 輸出數據長度
unsigned char chr_ds_name[SQL_MAX_DSN_LENGTH]; // 數據源名稱
SQLCHAR szConnStrOut[100];
public:
direxec(); // 構造器
void sqlconn(); // 分配 env, stat, and conn
void sqlexec(unsigned char *); // 執行 SQL statement
void sqldisconn(); // 釋放env, stat, conn的指針並且斷開連接
void error_out(); // 顯示錯誤
};
// 構造器使用數據源初始化chr_ds_name字符串。
direxec::direxec()
{
}
// 分配environment句柄,分配connection句柄,
// 連接數據源,並且分配statement。
void direxec::sqlconn(void)
{
SQLAllocEnv(&henv);
SQLAllocConnect(henv,&hdbc);
// 使用SQLConnect進行連接
rc=SQLDriverConnect(hdbc,NULL,(SQLCHAR *)"Driver={GBase ODBC 8.3 Driver};SERVER=192.168.1.225;UID=sysdba;PWD=111111;Database=northwind",SQL_NTS,szConnStrOut,SQL_NTS,NULL,0);
// 釋放句柄,顯示錯誤信息,並且退出
if (!GBASESUCCESS(rc))
{
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
printf("連接GBase服務器失敗,程序退出。 \n\n");
exit(-1);
}
else
{
printf("使用SQLDriverConnect成功連接GBase服務器。 \n\n");
}
rc=SQLAllocStmt(hdbc,&hstmt);
}
// 使用 ODBC API SQLExecDirect()執行SQL指令,並且使用遊標取得記錄。
void direxec::sqlexec(unsigned char * cmdstr)
{
SQLCHAR FirstNameArray[50], LastNameArray[50];
SDWORD cbValue=0;
UWORD fLevel2=FALSE;
// 判斷可滾動遊標是否可用
rc = SQLGetFunctions(hdbc, SQL_API_SQLFETCHSCROLL,&fLevel2);
if(fLevel2){
printf("遊標可用\n");
}
else
{
printf("遊標不可用\n");
exit(-1);
}
//設定遊標類型
SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (SQLPOINTER) SQL_CURSOR_STATIC, 0);
//綁定數組
SQLBindCol(hstmt, 1, SQL_C_CHAR, FirstNameArray, sizeof(FirstNameArray),&cbValue);
SQLBindCol(hstmt, 2, SQL_C_CHAR, LastNameArray, sizeof(LastNameArray),&cbValue);
rc=SQLExecDirect(hstmt,cmdstr,SQL_NTS);
if (!GBASESUCCESS(rc)) //錯誤
{
error_out();
// 釋放句柄斷開連接
SQLFreeStmt(hstmt,SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
exit(-1);
}
else
{
rc=SQLFetchScroll(hstmt,SQL_FETCH_LAST,0);
printf("最後的一條記錄: ");
printf((const char *)FirstNameArray);
printf(" ");
printf((const char *)LastNameArray);
printf("\n");
rc=SQLFetchScroll(hstmt,SQL_FETCH_FIRST,0);
printf("第1條記錄: ");
printf((const char *)FirstNameArray);
printf(" ");
printf((const char *)LastNameArray);
printf("\n");
rc=SQLFetchScroll(hstmt,SQL_FETCH_ABSOLUTE,5);
printf("第5條記錄: ");
printf((const char *)FirstNameArray);
printf(" ");
printf((const char *)LastNameArray);
printf("\n");
//關閉遊標
SQLCloseCursor(hstmt);
}
}
// 釋放statement句柄,斷開連接,釋放connection句柄,釋放enviroment句柄。
void direxec::sqldisconn(void)
{
SQLFreeStmt(hstmt,SQL_DROP);
SQLDisconnect(hdbc);
SQLFreeConnect(hdbc);
SQLFreeEnv(henv);
}
// 顯示錯誤信息
void direxec::error_out(void)
{
unsigned char szSQLSTATE[10];
SDWORD nErr;
unsigned char msg[SQL_MAX_MESSAGE_LENGTH+1];
SWORD cbmsg;
while(SQLError(0,0,hstmt,szSQLSTATE,&nErr,msg,sizeof(msg),&cbmsg)==
SQL_SUCCESS)
{
wsprintf((char *)szData,"Error:\nSQLSTATE=%s,Native error=%ld,msg='%s'",szSQLSTATE,nErr,msg);
printf((const char *)szData);
}
}
int main ()
{
// 聲明一個direxec對象的實例
direxec x;
// 分配句柄,並且建立連接.
x.sqlconn();
// 執行SQL指令 "SELECT first name, last_name FROM employee".
x.sqlexec((UCHAR FAR *)"SELECT FirstName, LastName FROM employees");
// 釋放句柄,斷開連接.
x.sqldisconn();
// 返回success code;示例執行成功
return (TRUE);
}
二、代碼調試測試
注意:修改爲自己的IP,用戶名和密碼。
本機按照的驅動是win10 ,安裝的ODBC驅動是【ODBC 數據源(32 位)】
在本機VS2017 創建的環境中,在DEBUG X86 設置下是可以正確跑通程序的。