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