用VC訪問Sybase資料庫(用Sybase提供的ct-library介面) (轉)

worldblog發表於2007-12-15
用VC訪問Sybase資料庫(用Sybase提供的ct-library介面) (轉)[@more@]

  前段我在做一個專案時,要用到透過客戶端連線Sybase的問題。

在此之前,我做過好多access, SERVER資料庫的專案,都是用ADO技術來實現的。但是這一次,領導要求用Sybase資料庫提供的ct-library介面,所以一下子以前所知道的資料庫訪問技術都沒有了用武之地,我當時在csdn上發過貼子,問過這個問題,但回應很少,現在這個問題已解決了,我想寫出來,和大家一塊探討,共同學習,也好給以後遇到這個問題的人一個指導。
  首先,必須Sybase客戶端並Sybase客戶端。安裝完成後要從中執行

dsedit進行配置。server為要訪問的資料庫的名字,還有Sybase資料庫所在機子的IP和

Port及訪問的TCP;不會配置的,可以請教一下身邊的高手。
  當配置完畢後,可以用來檢查配置的正確性。
  下面就進入到了。
  在此,你還要讓你的工程包含Sybase的頭和動態連結庫。讓程式能認識Sybase

。打Tool---&gtOptions後,選擇Directories標籤,Show directories for 中選擇

Include files後,你就可以增加Sybase的包含:例我這裡Sybase是安裝在C:所以我指

定為:C:sybaseinclude;同樣,再選擇Library files指定:C:sybaselib,就ok了。
  1.包含標頭檔案。在你要連線Sybase資料庫程式碼的標頭檔案中新增#include

,此時你就可以編譯一下,如果說找不到此標頭檔案,說明你上面包含指定的路徑不正確。
  2.宣告兩個連線 Sybase 資料庫必須的變數。
 CS_CONTEXT  *context; /* 內容結構 */
 CS_CONNECTION  *ptrconnection; /* 連線結構 */
  我個人認為用ct-library介面訪問sybase資料庫與用ADO技術有很多相似之處,也

可以說訪問資料庫一般差不多,都是先建立空間,再建立連線。
  並初始化context:  context = (CS_CONTEXT *)NULL;
  3.我定義了下面幾個函式:
 BOOL  ConnectSybase(CString strDBName,CString strUser,CString

strPass); //連線資料庫:true成功,false失敗 其引數分別為:資料庫名,訪問資料庫

的名,密碼。這個strDBName就是Sybase客啟端配置時的Server名字。
 void  DinnectSybaseDB();  //斷開資料庫
 void  ShowDBError(int  nErrCode);  //顯示連線資料庫時的錯誤資訊
  4.具體實現:
//////////////**********建立連線函式***********//////////////
   ConnectSybaseDB(CString strDBName,CString strUser,CString strPass)
{
 CS_RETCODE  ret;
 char username[32],pass[32];
 memset(username,0,sizeof(username));
 memset(password,0,sizeof(password));
   strcpy(username,strUser);
 strcpy(password,strPassword);
 /*分配內容結構*/
 if((ret=cs_ctx_alloc(CS_VERSION_100, &context)) != CS_SUCCEED)
 {   //不成功則ShowDBError顯示錯誤程式碼
 ShowDBError(ret);
 return FALSE;
 }
 /*初始化Client_Library*/
 if((ret=ct_init(context,CS_VERSION_100)) != CS_SUCCEED)
 {
 ShowDBError(ret);
 return FALSE;
 }
 /*分配連線結構*/
 if((ret=ct_con_alloc(context,&ptrconnection))!=CS_SUCCEED)
 {
 ShowDBError(ret);
 return FALSE;
 }
 /*設定使用者名稱和口令*/
if((ret=ct_con_props(ptrconnection,CS_SET,CS_USERNAME,username,CS_NULLTERM,NU

LL))!=CS_SUCCEED)
 {
 ShowDBError(ret);
 return FALSE;
 } 
 

if((ret=ct_con_props(ptrconnection,CS_SET,CS_PASSWORD,password,CS_NULLTERM,NU

LL))!=CS_SUCCEED)
 {
 ShowDBError(ret);
 return FALSE;
 }
 /*建立連線*/
 char instance[20];
 strcpy(instance,strDBName);
 if((ret=ct_connect(ptrconnection, (CS_CHAR *)instance,

sizeof(instance))) != CS_SUCCEED)
 {

 ShowDBError(ret);
 return FALSE;
 }
 else
 return TRUE;
}
 //////////////**********斷開連線函式***********//////////////
  void  DisConnectSybaseDB()
{
 CS_RETCODE ret;
 if ((ret = ct_close(ptrconnection, CS_UNUSED))!= CS_SUCCEED)
 {
 ShowDBError(ret);
 }
 if ((ret = ct_con_drop(ptrconnection)) != CS_SUCCEED)/*釋放資源*/
 {
 ShowDBError(ret);
 }
 if((ret=ct_exit(context,CS_UNUSED))!=CS_SUCCEED)/*關閉與的所有

連線,退出CT-L*/
 {
 ShowDBError(ret);
 }
 if((ret=cs_ctx_drop(context))!=CS_SUCCEED)/*釋放環境結構佔用的資源*/
 {
 ShowDBError(ret);
 }
   context = (CS_CONTEXT *)NULL;
  return;
}
//////////////**********顯示錯誤程式碼函式***********//////////////
  void  ShowDBError(int  nErrCode)
{
 CString strDBErrorInfo;
 switch(nErrCode)
 {
 case CS_MEM_ERROR: 
 strcpy(strDBErrorInfo, "不足或地址分配錯誤!"); 
 break;
 case CS_PENDING:
 strcpy(strDBErrorInfo, "非同步網路I/O正在進行!"); 
 break;
 case CS_BUSY:
 strcpy(strDBErrorInfo, "當前連線內有一非同步操作正在進行!");
 break;
 case CS_CANCELED:
 strcpy(strDBErrorInfo, "操作被取消!");
 break;
 case CS_END_RESULTS:
 strcpy(strDBErrorInfo, "從伺服器返回的結果處理結束!");
 break;
 case CS_ROW_FAIL:
 strcpy(strDBErrorInfo, "提取當前行的資料失敗!");
 break;
 case CS_END_DATA:
 strcpy(strDBErrorInfo, "資料提取結束!");
 break;
 case CS_FAIL:
 strcpy(strDBErrorInfo, "函式失敗!");
 break; 
 default:
 strcpy(strDBErrorInfo, "不識別的錯誤!");
 break; 
 }
 AfxMessageBox(strDBErrorInfo);
 
}

  以上是簡單的連線斷開與顯示錯誤資訊的一些程式碼,供大家參考。請大家多指導,和

大家共同進步。我的信箱:to:moorhen@263">moorhen@263.net 如轉載請標明作者:luckyegg


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993882/,如需轉載,請註明出處,否則將追究法律責任。

相關文章