明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

用VC訪問(wèn)Sybase數(shù)據(jù)庫(kù)

[摘要]關(guān)鍵字 Sybase,數(shù)據(jù)庫(kù)訪問(wèn),ct-library接口 前段我在做一個(gè)項(xiàng)目時(shí),要用到通過(guò)Sybase客戶(hù)端連接網(wǎng)絡(luò)Sybase數(shù)據(jù)庫(kù)的問(wèn)題。在此之前,我做過(guò)好多access,...
關(guān)鍵字     Sybase,數(shù)據(jù)庫(kù)訪問(wèn),ct-library接口
  
    前段我在做一個(gè)項(xiàng)目時(shí),要用到通過(guò)Sybase客戶(hù)端連接網(wǎng)絡(luò)Sybase數(shù)據(jù)庫(kù)的問(wèn)題。

在此之前,我做過(guò)好多access,SQL server數(shù)據(jù)庫(kù)的項(xiàng)目,都是用ADO技術(shù)來(lái)實(shí)現(xiàn)的。但是這一次,領(lǐng)導(dǎo)要求用Sybase數(shù)據(jù)庫(kù)提供的ct-library接口,所以一下子以前所知道的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)都沒(méi)有了用武之地,我當(dāng)時(shí)在csdn上發(fā)過(guò)貼子,問(wèn)過(guò)這個(gè)問(wèn)題,但回應(yīng)很少,現(xiàn)在這個(gè)問(wèn)題已解決了,我想寫(xiě)出來(lái),和大家一塊探討,共同學(xué)習(xí),也好給以后遇到這個(gè)問(wèn)題的人一個(gè)入門(mén)指導(dǎo)。
    首先,必須安裝Sybase客戶(hù)端并配置Sybase客戶(hù)端。安裝完成后要從程序中運(yùn)行

dsedit進(jìn)行配置。server為要訪問(wèn)的數(shù)據(jù)庫(kù)的名字,還有Sybase數(shù)據(jù)庫(kù)所在機(jī)子的IP和

Port及訪問(wèn)的協(xié)議TCP;不會(huì)配置的,可以請(qǐng)教一下身邊的高手。
           當(dāng)配置完畢后,可以用ping來(lái)檢查配置的正確性。
    下面就進(jìn)入到編程了。
    在此,你還要讓你的工程包含Sybase的頭文件和動(dòng)態(tài)鏈接庫(kù)。讓程序能認(rèn)識(shí)Sybase

函數(shù)。打Tool--->Options后,選擇Directories標(biāo)簽,Show directories for 中選擇

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

定為:C:\sybase\include;同樣,再選擇Library files指定:C:\sybase\lib,就ok了。
    1.包含頭文件。在你要連接Sybase數(shù)據(jù)庫(kù)代碼的頭文件中添加#include

<ctpublic.h>,此時(shí)你就可以編譯一下,如果說(shuō)找不到此頭文件,說(shuō)明你上面包含指定的路徑不正確。
    2.聲明兩個(gè)連接 Sybase 數(shù)據(jù)庫(kù)必須的變量。
CS_CONTEXT         *context;  /* 內(nèi)容結(jié)構(gòu) */
CS_CONNECTION      *ptrconnection; /* 連接結(jié)構(gòu) */
     我個(gè)人認(rèn)為用ct-library接口訪問(wèn)sybase數(shù)據(jù)庫(kù)與用ADO技術(shù)有很多相似之處,也

可以說(shuō)訪問(wèn)數(shù)據(jù)庫(kù)一般差不多,都是先創(chuàng)建空間,再創(chuàng)建連接。
       并初始化context:      context = (CS_CONTEXT *)NULL;
    3.我定義了下面幾個(gè)函數(shù):
BOOL  ConnectSybaseDB(CString strDBName,CString strUser,CString

strPass); //連接數(shù)據(jù)庫(kù):true成功,false失敗 其參數(shù)分別為:數(shù)據(jù)庫(kù)名,訪問(wèn)數(shù)據(jù)庫(kù)

的用戶(hù)名,密碼。這個(gè)strDBName就是Sybase客啟端配置時(shí)的Server名字。
void    DisConnectSybaseDB();         //斷開(kāi)數(shù)據(jù)庫(kù)
void    ShowDBError(int  nErrCode);   //顯示連接數(shù)據(jù)庫(kù)時(shí)的錯(cuò)誤信息
   4.具體實(shí)現(xiàn):
//////////////**********建立連接函數(shù)***********//////////////
       ConnectSybaseDB(CString strDBName,CString strUser,CString strPass)
{
CS_RETCODE     ret;
char username[32],password[32];
memset(username,0,sizeof(username));
memset(password,0,sizeof(password));
     strcpy(username,strUser);
strcpy(password,strPassword);
/*分配內(nèi)容結(jié)構(gòu)*/
if((ret=cs_ctx_alloc(CS_VERSION_100, &context)) != CS_SUCCEED)
{   //不成功則調(diào)用ShowDBError顯示錯(cuò)誤代碼
  ShowDBError(ret);
  return FALSE;
}
/*初始化Client_Library*/
if((ret=ct_init(context,CS_VERSION_100)) != CS_SUCCEED)
{
  ShowDBError(ret);
  return FALSE;
}
/*分配連接結(jié)構(gòu)*/
if((ret=ct_con_alloc(context,&ptrconnection))!=CS_SUCCEED)
{
  ShowDBError(ret);
  return FALSE;
}
/*設(shè)置用戶(hù)名和口令*/
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;
}
//////////////**********斷開(kāi)連接函數(shù)***********//////////////
        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)/*關(guān)閉與服務(wù)器的所有

連接,退出CT-L*/
{
  ShowDBError(ret);
}
if((ret=cs_ctx_drop(context))!=CS_SUCCEED)/*釋放環(huán)境結(jié)構(gòu)占用的資源*/
{
  ShowDBError(ret);
}
    context = (CS_CONTEXT *)NULL;
        return;
}
//////////////**********顯示錯(cuò)誤代碼函數(shù)***********//////////////
   void    ShowDBError(int  nErrCode)
{
CString strDBErrorInfo;
switch(nErrCode)
{
case CS_MEM_ERROR:  
  strcpy(strDBErrorInfo, "內(nèi)存不足或地址分配錯(cuò)誤!");   
  break;
case CS_PENDING:
  strcpy(strDBErrorInfo, "異步網(wǎng)絡(luò)I/O正在進(jìn)行!");   
  break;
case CS_BUSY:
  strcpy(strDBErrorInfo, "當(dāng)前連接內(nèi)有一異步操作正在進(jìn)行!");
  break;
case CS_CANCELED:
  strcpy(strDBErrorInfo, "操作被取消!");
  break;
case CS_END_RESULTS:
  strcpy(strDBErrorInfo, "從服務(wù)器返回的結(jié)果處理結(jié)束!");
  break;
case CS_ROW_FAIL:
  strcpy(strDBErrorInfo, "提取當(dāng)前行的數(shù)據(jù)失敗!");
  break;
case CS_END_DATA:
  strcpy(strDBErrorInfo, "數(shù)據(jù)提取結(jié)束!");
  break;
case CS_FAIL:
  strcpy(strDBErrorInfo, "函數(shù)執(zhí)行失敗!");
  break;  
default:
  strcpy(strDBErrorInfo, "系統(tǒng)不識(shí)別的錯(cuò)誤!");
  break;  
}
AfxMessageBox(strDBErrorInfo);

}

   以上是簡(jiǎn)單的連接斷開(kāi)與顯示錯(cuò)誤信息的一些代碼,供大家參考。請(qǐng)大家多指導(dǎo),和

大家共同進(jìn)步。我的信箱:moorhen@263.net 如轉(zhuǎn)載請(qǐng)標(biāo)明作者:luckyegg