天天看點

【資料庫】MFC ODBC(一)

一、動态建立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>以支援資料庫操作。