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>以支持數據庫操做。