用VC訪問Sybase數據庫

選擇自 luckyegg 的 Blog

 

    前段我在做一個項目時,要用到通過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, NULL)) !=     CS_SUCCEED)
    {
        ShowDBError(ret);
        return FALSE;
    }


    if ((ret = ct_con_props(ptrconnection, CS_SET, CS_PASSWORD, password, CS_NULLTERM, NULL)) != 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);
    }

    /*關閉和服務器的所有連接,退出CT-L*/
    if ((ret = ct_exit(context, CS_UNUSED)) != CS_SUCCEED)
    {
        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);

}

以上是簡單的連接斷開和顯示錯誤信息的一些代碼,供大家參考。請大家多指導,和大家一起進步。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章