【數據庫】MFC ODBC(一)

1、動態建立ODBC數據源數據庫

ODBC API提供了動態建立數據源的函數SQLConfigDataSource。該函數的原型以下:函數

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

參數說明以下:spa

(1)hwndParentcode

指定父窗口句柄,在不須要建立數據源對話框時,能夠將該參數指定爲NULL。blog

(2)fRequestci

指定函數的操做內容,取值以下:字符串

ODBC_ADD_DSN: 加入一個新的用戶數據源;原型

ODBC_CONFIG_DSN:修改一個存在的用戶數據源;it

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的屬性。

注意:

一、使用SQLConfigDataSource函數時必須聲明包含系統的odbcinst.h頭文件。

二、使用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。


 

2、鏈接數據源

舉例以下:

//測試是否處於打開狀態
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>以支持數據庫操做。

相關文章
相關標籤/搜索