南大通用數據庫(5):windows上代碼運行調試。

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 設置下是可以正確跑通程序的。

發佈了23 篇原創文章 · 獲贊 13 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章