【資料庫】MFC ODBC(一)

QingLiXueShi發表於2015-10-05

一、動態建立ODBC資料來源

ODBC API提供了動態建立資料來源的函式SQLConfigDataSource。該函式的原型如下:

BOOL SQLConfigDataSource ( HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes );

引數說明如下:

(1)hwndParent

指定父視窗控制程式碼,在不需要建立資料來源對話方塊時,可以將該引數指定為NULL。

(2)fRequest

指定函式的操作內容,取值如下:

ODBC_ADD_DSN: 加入一個新的使用者資料來源;

ODBC_CONFIG_DSN:修改一個存在的使用者資料來源;

ODBC_REMOVE_DSN:除一個存在的使用者資料來源;

ODBC_ADD_SYS_DSN:增加一個新的系統資料來源;

ODBC_CONFIG_SYS_DSN:配置或者修改一個存在的系統資料來源;

ODBC_REMOVE_SYS_DSN:刪除一個存在的系統資料來源;

ODBC_REMOVE_DEFAULT_DSN:刪除省缺的資料來源說明部分。

(3)lpszDriver

指定ODBC資料引擎名稱。例如:Microsoft Access Driver (*.mdb)、SQL Server,Microsoft ODBC for Oracle等。

(4)lpszAttributes

指定ODBC資料來源屬性,包含配置資料來源所必要的一組關鍵字-值的列表。部分關鍵字描述如下:

DSN:資料來源名稱;

FILEDSN:檔案資料來源名稱;

DRIVER:資料驅動的描述;例如:SQL Server, ORACLE等。

UID:使用者ID;

PWD:UID對應的口令,如果沒有口令,也可為空字串;

SAVEFILE:儲存維持當前成功連線的關鍵字屬性值的.dsn檔名稱;

DATABASE:資料庫名稱;

DBQ:資料庫檔案絕對路徑(包含檔名);

DEFAULTDIR:預設資料庫檔案路徑(不包含檔名);

注意:

1)如果lpszAttributes提供的資訊不夠完善,在建立過程中就會出現對話方塊要求使用者提供相應資訊。

2)每兩個Key-Name值之間用'\0'隔開,最後一個Key-Name值後面有兩個'\0'。

3)執行regedit開啟登錄檔,依次開啟HKEY_CURRENT_USER->Software->ODBC->ODBC.INI,可以看到已註冊的DSN,可以仿照已註冊的DSN屬性來設定lpszAttributes。

4)DSN的名字必須唯一,如果要註冊的DSN已被註冊過,那麼SQLConfigDataSource就修改原來DSN的屬性。

注意:

1、使用SQLConfigDataSource函式時必須宣告包含系統的odbcinst.h標頭檔案。

2、使用SQLConfigDataSource函式時必須用到odbccp32.dll,它是Microsoft 提供的32 位ODBC安裝和管理的DLL,如果是16 位必須用到odbcinst.dll,odbccp32.dll 有一個import library。解決辦法是把odbccp32.lib加到我們的專案中,我們可以開啟Project系統選單項,選Add to Project子選單,在其中選Files項,開啟VC安裝目錄下的\vc\lib\目錄,檔案型別選Library Files(.lib) , 選擇其中odbccp32.lib後按OK鍵。同時將ODBCCP32.DLL放於系統子目錄下。

舉例如下:

CString strDir;
::GetCurrentDirectory(MAX_PATH, strDir.GetBuffer(MAX_PATH + 1));
strDir.ReleaseBuffer();

TCHAR szTempPath[MAX_PATH + 1] = {'\0'};
sprintf(szTempPath, "DSN=%s!DBQ=%s!DEFAULTDIR=%s!!", CString("SOWM") 
        , strDir + CString("\\SOWM.mdb"), strDir);

int szTempPathLen = strlen(szTempPath);
for (int i = 0; i < szTempPathLen; ++i) {
    if (szTempPath[i] == '!')
        szTempPath[i] = '\0';
}

if (!SQLConfigDataSource(NULL, ODBC_ADD_SYS_DSN
    , "Microsoft Access Driver (*.mdb)\0"
    , (LPCSTR)szTempPath)) {
    AfxMessageBox("配置ODBC資料來源失敗!");
    return FALSE;
}

如果要訪問區域網上的Access檔案,lpszAttributes可加入:Data Source=\\IP地址\\共享資料夾\\SOWM.mdb。


 

二、連線資料來源

舉例如下:

//測試是否處於開啟狀態
if (!m_Database.IsOpen()) {
    TRY 
    {
        if (!m_Database.OpenEx(_T("SOWM"), CDatabase::noOdbcDialog))
            AfxMessageBox("Database Opened Failed.\n");
    }
    CATCH (CMemoryException, e)
    {
        TRACE("Database Opened Memory Exception occur.\n");
    }
    CATCH (CDBException, e)
    {
        TRACE("Database Opened DB Exception occur: %s\n", e->m_strError);
    }
    END_CATCH
}

 解構函式中加入:

if (m_Database.IsOpen())
    m_Database.Close();

 注意:在stdafx.h中加入#include <afxdb.h>以支援資料庫操作。

相關文章