爲了使ODBC能與數據庫起工作,必須把數據庫註冊到ODBC驅動程序管理器,這項工作可以通過定義一個DSN或數據源名字來完成。通常,我們只能手動打開系統控制面板,運行其中的ODBC數據源管理器,手工配置數據源,這次做公司裏的手機借用信息管理系統老大要求程序運行的時候自動完成數據源的配置,我做爲一個才用VC寫程序一週時間的菜鳥,只好邊找資料便做,網上的資料百分之八十都是重複的,其實做完後覺得是一個很簡單的事情,結果在上面浪費了4、5個小時。我把找的資料和一些需要注意的東西放到空間裏來,或許下次和那些剛學VC的人有些幫助。
一、我寫的最簡單的代碼段(加入到你要使用到數據庫或者是程序啓動初始化的文件函數裏),沒有寫錯誤處理部分,是不完整的,但是可以用了,爲了敢時間就注意將就着用一下把。在下個系統下個版本里修改一下。代碼段如下:
if(!SQLConfigDataSource(NULL,ODBC_ADD_SYS_DSN,"Microsoft Access Driver (*.mdb)/0",
"DSN=mobilephone/0"
"Description=mobilephone/0"
"DBQ=////smcrdsvr//樣機登記//mobilephone.mdb/0"
"FIL=MS Access/0"
"DriverId=25/0"))
{
MessageBox("註冊數據源DSN失敗!");
}
1、 要注意" /0",只要是字符串的地方都需要加是,負責你只有使勁找錯誤,但是錯誤提示你還沒辦法找到錯誤出處,我就在這個上面花了很長時間。
2、 在填寫數據庫路徑的時候要在每一個“/”前再加一個”/”,這樣才能夠讓MFC認出這個是路徑的信息。
3、 如果你用的是Access 2003(我就是用的這個做的程序),那麼用來設置數據庫路徑的"DBQ=////smcrdsvr//樣機登記//mobilephone.mdb/0"一定爲能夠把其中的DBQ改爲” DataDirectory”、” DefaultDir”之類的,我開始按網上的資料做結果就因爲沒有用DBQ而是用的DefaultDir弄了好久都沒有對。但是其他的數據庫可能又不一樣。我沒有試過。
4、 DriverId的值不同的數據庫有不同的值,同樣的數據庫有可能因爲版本不一樣也會不同。大家注意區分。
二、網上資料:
1. SQLConfigDataSource 函數說明
ODBC API提供了動態創建數據源的函數SQLConfig DataSource。該函數的原型如下:
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數據源的驅動
程序類別,例如,爲了指定Access數據源,該參數應賦以字符串“Microsoft Access Driver (*.mdb)/0”;對SQL Server數據源,則應賦以字符串“SQL Server”。
(4)參數lpszAttributes用於指定ODBC數據源屬性。例如:
① 對Access數據源:
"DSN= MYIMAGE/0 DBQ=D://ImageProcess//image.mdb/0
DEFAULTDIR= D://ImageProcess/0/0"
說明:該字符串指定數據源名稱(DNS)爲MYIMAGE;數據庫文件(DBQ)爲D://ImageProcess//image.mdb ;缺省數據庫文件路徑(DEFAULTDIR) 爲D://ImageProcess 。
② 對SQL SERVER數據源:
"DSN=MYIMAGE/0 SERVER=MYET/0 DATABASE=Image"
說明:該字符串指定數據源名稱(DSN)爲MYIMAGE;SQLSERVER 數據庫服務器名(SERVER)爲 MYET;數據庫名稱(DATABASE)爲Image。
2 .兩個需要注意的問題
(1)當我們使用SQLConfigDataSource ODBC API函數時必須聲明包含系統的odbcinst.h頭文件,所以我們再選擇workspace窗口中FileView打開Header Files中Imageprocess.h,在其中加入#include“odbcinst.h”。
(2)SQLConfigDataSource 這個API函數時候必須用到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鍵。
3 .程序代碼
從上文看出設置參數lpszAttributes時需要設置數據庫文件的路徑,爲了方便用戶的使用,可以將數據庫文件保存到該項目的debug文件夾下,通過程序實現自動獲取數據庫文件路徑的功能,代碼如下:
CString szPath;
GetModuleFileName(NULL,sPath.GetBufferSetLength
(MAX_PATH+1),MAX_PATH);
szPath.ReleaseBuffer ();
int nPos;
nPos=szPath.ReverseFind (’//’);
szPath=szPath.Left (nPos);
CString szFile = sPath + "//image.mdb";
char szAtr[256];
sprintf(szAtr,"DSN=%s!DBQ=%s!DEFAULTDIR=%s!! ","MYIMAGE",
szFile,szPath);
int nlen;
nlen = strlen(szAtr);
for (int i=0; i<nlen; i++)
{
if (szAtr [i] == ’!’)
szAtr [i] = ’/0’;
}
if (FALSE == SQLConfigDataSource(NULL,
ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)/0",
(LPCSTR)szAtr))
AfxMessageBox("SQLConfigDataSource Failed");
編譯並運行程序後,可以通過控制面板的ODBC數據源管理器或註冊表查看運行結果,就會看到數據庫已經成功的註冊了。