电竞比分网-中国电竞赛事及体育赛事平台

分享

用VC++實(shí)現(xiàn)ODBC數(shù)據(jù)源設(shè)置 - VC教程 - CND8學(xué)院

 烏拉拉1226 2011-01-19

用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)工作可以通過(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;
}
}

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多