關鍵字 Sybase,數據庫訪問,ct-library接口 前段我在做一個項目時,要用到通過Sybase客戶端連接網絡Sybase數據庫的問題。
在此之前,我做過好多access,SQL server數據庫的項目,都是用ADO技術來實現的。但是這一次,領導要求用Sybase數據庫提供的ct-library接口,所以一下子以前所知道的數據庫訪問技術都沒有了用武之地,我當時在csdn上發過貼子,問過這個問題,但回應很少,現在這個問題已解決了,我想寫出來,和大家一塊探討,共同學習,也好給以后遇到這個問題的人一個入門指導。 首先,必須安裝Sybase客戶端并配置Sybase客戶端。安裝完成后要從程序中運行
dsedit進行配置。server為要訪問的數據庫的名字,還有Sybase數據庫所在機子的IP和
Port及訪問的協議TCP;不會配置的,可以請教一下身邊的高手。 當配置完畢后,可以用ping來檢查配置的正確性。 下面就進入到編程了。 在此,你還要讓你的工程包含Sybase的頭文件和動態鏈接庫。讓程序能認識Sybase
函數。打Tool--->Options后,選擇Directories標簽,Show directories for 中選擇
Include files后,你就可以增加Sybase的包含:例我這里Sybase是安裝在C:所以我指
定為:C:\sybase\include;同樣,再選擇Library files指定:C:\sybase\lib,就ok了。 1.包含頭文件。在你要連接Sybase數據庫代碼的頭文件中添加#include
<ctpublic.h>,此時你就可以編譯一下,如果說找不到此頭文件,說明你上面包含指定的路徑不正確。 2.聲明兩個連接 Sybase 數據庫必須的變量。 CS_CONTEXT *context; /* 內容結構 */ CS_CONNECTION *ptrconnection; /* 連接結構 */ 我個人認為用ct-library接口訪問sybase數據庫與用ADO技術有很多相似之處,也
可以說訪問數據庫一般差不多,都是先創建空間,再創建連接。 并初始化context: context = (CS_CONTEXT *)NULL; 3.我定義了下面幾個函數: BOOL ConnectSybaseDB(CString strDBName,CString strUser,CString
strPass); //連接數據庫:true成功,false失敗 其參數分別為:數據庫名,訪問數據庫
的用戶名,密碼。這個strDBName就是Sybase客啟端配置時的Server名字。 void DisConnectSybaseDB(); //斷開數據庫 void ShowDBError(int nErrCode); //顯示連接數據庫時的錯誤信息 4.具體實現: //////////////**********建立連接函數***********////////////// 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); /*分配內容結構*/ 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); }
以上是簡單的連接斷開與顯示錯誤信息的一些代碼,供大家參考。請大家多指導,和
大家共同進步。我的信箱:moorhen@263.net 如轉載請標明作者:luckyegg
|