為了使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資料來源管理器或註冊表查看運行結果,就會看到資料庫已經成功的註冊了。
創作者介紹

資訊園

shadow 發表在 痞客邦 PIXNET 留言(0) 人氣()