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