用VC++實(shí)現(xiàn)ODBC數(shù)據(jù)源設(shè)置
CND8學(xué)院 VC教程 發(fā)布日期:2008年12月11日
為了使ODBC能與數(shù)據(jù)庫(kù)一起工作,必須把數(shù)據(jù)庫(kù)注冊(cè)到ODBC驅(qū)動(dòng)程序管理器,這項(xiàng)工作可以通過(guò)定義一個(gè)DSN或數(shù)據(jù)源名字來(lái)完成。通常,我們只能手動(dòng)打開(kāi)系統(tǒng)控制面板,運(yùn)行其中的ODBC數(shù)據(jù)源管理器,手工配置數(shù)據(jù)源,但是這項(xiàng)工作對(duì)用戶而言過(guò)于復(fù)雜,我們必須考慮用程序替用戶完成這些配置工作。
1. SQLConfigDataSource 函數(shù)說(shuō)明
ODBC API提供了動(dòng)態(tài)創(chuàng)建數(shù)據(jù)源的函數(shù)SQLConfig DataSource。該函數(shù)的原型如下:
BOOL SQLConfigDataSource ( HWND hwndParent,WORD fRequest, LPCSTR lpszDriver,LPCSTR lpszAttributes ); 參數(shù)說(shuō)明如下:
?。?)參數(shù)hwndParent用于指定父窗口句柄,在不需要?jiǎng)?chuàng)建數(shù)據(jù)源對(duì)話框時(shí),可以將該參數(shù)指定為NULL。
?。?)參數(shù)fRequest用于指定函數(shù)的操作內(nèi)容,取值如下:
ODBC_ADD_DSN: 加入一個(gè)新的用戶數(shù)據(jù)源;
ODBC_CONFIG_DSN:修改一個(gè)存在的用戶數(shù)據(jù)源;
ODBC_REMOVE_DSN:除一個(gè)存在的用戶數(shù)據(jù)源; ODBC_ADD_SYS_DSN:增加一個(gè)新的系統(tǒng)數(shù)據(jù)源;
ODBC_CONFIG_SYS_DSN:配置或者修改一個(gè)存在的系統(tǒng)數(shù)據(jù)源;
ODBC_REMOVE_SYS_DSN:刪除一個(gè)存在的系統(tǒng)數(shù)據(jù)源;
ODBC_REMOVE_DEFAULT_DSN:刪除省缺的數(shù)據(jù)源說(shuō)明部分。
?。?)參數(shù)lpszDriver用于指定ODBC數(shù)據(jù)源的驅(qū)動(dòng)
程序類別,例如,為了指定Access數(shù)據(jù)源,該參數(shù)應(yīng)賦以字符串“Microsoft Access Driver (*.mdb)”;對(duì)SQL SERVER數(shù)據(jù)源,則應(yīng)賦以字符串“SQL Server”。
?。?)參數(shù)lpszAttributes用于指定ODBC數(shù)據(jù)源屬性。例如:
① 對(duì)Access數(shù)據(jù)源:
"DSN= MYIMAGE DBQ=D:ImageProcessimage.mdb DEFAULTDIR= D:ImageProcess"
說(shuō)明:該字符串指定數(shù)據(jù)源名稱(DNS)為MYIMAGE;數(shù)據(jù)庫(kù)文件(DBQ)為D:ImageProcessimage.mdb ;缺省數(shù)據(jù)庫(kù)文件路徑(DEFAULTDIR) 為D:ImageProcess 。
?、?對(duì)SQL SERVER數(shù)據(jù)源:
"DSN=MYIMAGE SERVER=MYET DATABASE=Image"
說(shuō)明:該字符串指定數(shù)據(jù)源名稱(DSN)為MYIMAGE;SQLSERVER 數(shù)據(jù)庫(kù)服務(wù)器名(SERVER)為 MYET;數(shù)據(jù)庫(kù)名稱(DATABASE)為Image。
2 .兩個(gè)需要注意的問(wèn)題
(1)當(dāng)我們使用SQLConfigDataSource ODBC API函數(shù)時(shí)必須聲明包含系統(tǒng)的odbcinst.h頭文件,所以我們?cè)龠x擇workspace窗口中FileView打開(kāi)Header Files中Imageprocess.h,在其中加入#include“odbcinst.h”。
?。?)SQLConfigDataSource 這個(gè)API函數(shù)時(shí)候必須用到odbccp32.dll,它是Microsoft 提供的32 位ODBC安裝和管理的DLL,如果是16 位必須用到odbcinst.dll,odbccp32.dll 有一個(gè)import library,所以解決的辦法就是把這個(gè)odbccp32.lib加到我們的項(xiàng)目中,我們可以打開(kāi) Project系統(tǒng)菜單項(xiàng),選Add to Project子菜單,在其中選Files項(xiàng),打開(kāi)VC安裝目錄下的vclib目錄,文件類型選Library Files(.lib) , 選擇其中odbccp32.lib后按OK鍵。
3 .程序代碼
從上文看出設(shè)置參數(shù)lpszAttributes時(shí)需要設(shè)置數(shù)據(jù)庫(kù)文件的路徑,為了方便用戶的使用,可以將數(shù)據(jù)庫(kù)文件保存到該項(xiàng)目的debug文件夾下,通過(guò)程序?qū)崿F(xiàn)自動(dòng)獲取數(shù)據(jù)庫(kù)文件路徑的功能,代碼如下:
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] = ’’; } if (FALSE == SQLConfigDataSource(NULL, ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)", (LPCSTR)szAtr)) AfxMessageBox("SQLConfigDataSource Failed");
編譯并運(yùn)行程序后,可以通過(guò)控制面板的ODBC數(shù)據(jù)源管理器或注冊(cè)表查看運(yùn)行結(jié)果,就會(huì)看到數(shù)據(jù)庫(kù)已經(jīng)成功的注冊(cè)了。
下面再介紹一個(gè)通用函數(shù) /* 頭文件:#include <odbcinst.h> //SQLConfigDataSource 函數(shù):CrreateDSN 功能:動(dòng)態(tài)創(chuàng)建數(shù)據(jù)源 輸入?yún)?shù):CString str 名稱 CString strDatabase 數(shù)據(jù)庫(kù)的路徑 CString strDescription 說(shuō)明 CString strServer 服務(wù)器名稱 CString strUID 用戶名 int iCount 標(biāo)識(shí)數(shù)據(jù)庫(kù)類型, 1表示Access數(shù)據(jù)庫(kù); 2表示SQL Server; 3表示Oracle數(shù)據(jù)庫(kù) 返回值: int型 1: 表示創(chuàng)建Access數(shù)據(jù)源成功 -1: 表示創(chuàng)建Access數(shù)據(jù)源失敗 2: 表示創(chuàng)建SQL Server數(shù)據(jù)源成功 -2: 表示創(chuàng)建SQL Server數(shù)據(jù)源失敗 3: 表示創(chuàng)建Oracle數(shù)據(jù)源成功 -3: 表示創(chuàng)建Oracle數(shù)據(jù)源失敗 -4: 表示不支持創(chuàng)建其他類型的數(shù)據(jù)源 */
AFX_EXT_CLASS int CrreateDSN(CString str, CString strDatabase, CString strDescription, CString strServer, CString strUID, int iCount) { char* Attributes; int mlen, i; Attributes=new char[256]; switch(iCount) { case 1: sprintf(Attributes,"DSN=%s! DESCRIPTION=%s! DBQ=%s! FIL=MicrosoftAccess! DEFAULTDIR=D:\Database!!", str, strDescription, strDatabase); mlen = strlen(Attributes); for (i=0; i<mlen; i++) { if (Attributes[i] == '!') Attributes[i] = ''; } if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)",(LPCSTR)Attributes)) return 1; else return -1; break; case 2: sprintf(Attributes,"DSN=%s!Description=%s!server=%s!Database=%s!", str, strDescription, strServer, strDatabase); mlen = strlen(Attributes); for (i=0; i<mlen; i++) { if (Attributes[i] == '!') Attributes[i] = ''; } if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"SQL Server",(LPCSTR)Attributes)) return 2; else return -2; break; case 3: sprintf(Attributes,"DSN=%s!Description=%s!ServerName=%s!UserID=%s!", str, strDescription, strServer, strUID); mlen = strlen(Attributes); for (i=0; i<mlen; i++) { if (Attributes[i] == '!') Attributes[i] = ''; } if (FALSE == SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Oracle in OraHome92",(LPCSTR)Attributes)) return 3; else return -3; break; default: return -4; break; } } |