程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 用VC++實現ODBC數據源設置

用VC++實現ODBC數據源設置

編輯:vc教程

為了使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: 表示不支持創建其他類型的數據源
*/


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;
}
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved