用VC++實(shí)現(xiàn)ODBC數(shù)據(jù)源設(shè)置
CND8學(xué)院VC教程 發(fā)布日期:2008年12月11日
將本文收藏到:
|
收藏到本地 |
復(fù)制本文地址為了使ODBC能與數(shù)據(jù)庫(kù)一起工作,必須把數(shù)據(jù)庫(kù)注冊(cè)到ODBC驅(qū)動(dòng)程序管理器,這項(xiàng)工作可以通過定義一個(gè)DSN或數(shù)據(jù)源名字來完成。通常,我們只能手動(dòng)打開系統(tǒng)控制面板,運(yùn)行其中的ODBC數(shù)據(jù)源管理器,手工配置數(shù)據(jù)源,但是這項(xiàng)工作對(duì)用戶而言過于復(fù)雜,我們必須考慮用程序替用戶完成這些配置工作。
1. SQLConfigDataSource 函數(shù)說明
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ù)說明如下:
(1)參數(shù)hwndParent用于指定父窗口句柄,在不需要?jiǎng)?chuàng)建數(shù)據(jù)源對(duì)話框時(shí),可以將該參數(shù)指定為NULL。
(2)參數(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ù)源說明部分。
(3)參數(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”。
(4)參數(shù)lpszAttributes用于指定ODBC數(shù)據(jù)源屬性。例如:
① 對(duì)Access數(shù)據(jù)源:
"DSN= MYIMAGE DBQ=D:ImageProcessimage.mdb
DEFAULTDIR= D:ImageProcess"
說明:該字符串指定數(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"
說明:該字符串指定數(shù)據(jù)源名稱(DSN)為MYIMAGE;SQLSERVER 數(shù)據(jù)庫(kù)服務(wù)器名(SERVER)為 MYET;數(shù)據(jù)庫(kù)名稱(DATABASE)為Image。
2 .兩個(gè)需要注意的問題
(1)當(dāng)我們使用SQLConfigDataSource ODBC API函數(shù)時(shí)必須聲明包含系統(tǒng)的odbcinst.h頭文件,所以我們?cè)龠x擇workspace窗口中FileView打開Header Files中Imageprocess.h,在其中加入#include“odbcinst.h”。
(2)SQLConfigDataSource 這個(gè)API函數(shù)時(shí)候必須用到odbccp32.dll,它是Microsoft 提供的32 位ODBC安裝和管理的DLL,如果是16 位必須用到odbcinst.dll,odbccp32.dll 有一個(gè)import library,所以解決的辦法就是把這個(gè)odbccp32.lib加到我們的項(xiàng)目中,我們可以打開
Project系統(tǒng)菜單項(xiàng),選Add to Project子菜單,在其中選Files項(xiàng),打開VC安裝目錄下的vclib目錄,文件類型選Library Files(.lib) , 選擇其中odbccp32.lib后按OK鍵。
3 .程序代碼
從上文看出設(shè)置參數(shù)lpszAttributes時(shí)需要設(shè)置數(shù)據(jù)庫(kù)文件的路徑,為了方便用戶的使用,可以將數(shù)據(jù)庫(kù)文件保存到該項(xiàng)目的debug文件夾下,通過程序?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)行程序后,可以通過控制面板的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 說明
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;
}
}