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