為了使ODBC能與數據庫一起工作,必須把數據庫注冊到ODBC驅動程序管理器,這項工作可以通過定義一個DSN或數據源名字來完成。通常,我們只能手動打開系統控制面板,運行其中的ODBC數據源管理器,手工配置數據源,但是這項工作對用戶而言過於復雜,我們必須考慮用程序替用戶完成這些配置工作。
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)”;對SQL SERVER數據源,則應賦以字符串“SQL Server”。
(4)參數lpszAttributes用於指定ODBC數據源屬性。例如:
① 對Access數據源:
"DSN= MYIMAGE DBQ=D:ImageProcessimage.mdb
DEFAULTDIR= D:ImageProcess"
說明:該字符串指定數據源名稱(DNS)為MYIMAGE;數據庫文件(DBQ)為D:ImageProcessimage.mdb ;缺省數據庫文件路徑(DEFAULTDIR) 為D:ImageProcess 。
② 對SQL Server數據源:
"DSN=MYIMAGE SERVER=MYET 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安裝目錄下的vclib目錄,文件類型選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] = ’’;
}
if (FALSE == SQLConfigDataSource(NULL, ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)", (LPCSTR)szAtr))
AfxMessageBox("SQLConfigDataSource Failed");
編譯並運行程序後,可以通過控制面板的ODBC數據源管理器或注冊表查看運行結果,就會看到數據庫已經成功的注冊了。
下面再介紹一個通用函數
/*
頭文件:#include <odbcinst.h> //SQLConfigDataSource
函數:CrreateDSN
功能:動態創建數據源
輸入參數:CString str 名稱
CString strDatabase 數據庫的路徑
CString strDescription 說明
CString strServer 服務器名稱
CString strUID 用戶名
int iCount 標識數據庫類型, 1表示Access數據庫; 2表示SQL Server; 3表示Oracle數據庫
返回值: int型
1: 表示創建Access數據源成功
-1: 表示創建Access數據源失敗
2: 表示創建SQL Server數據源成功
-2: 表示創建SQL Server數據源失敗
3: 表示創建Oracle數據源成功
-3: 表示創建Oracle數據源失敗
-4: 表示不支持創建其他類型的數據源
*/