SQLConfigDataSource() 
SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft FoxPro Driver (*.dbf)", 
"DSN=MYDB"

"Defau">

      技術頻道

      如何在VC++6.O下動態加載ODBC數據源

      如何在VC++6.O 下動態加載 ODBC數據源

      SQLConfigDataSource()
      SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft FoxPro Driver (*.dbf)",
      "DSN=MYDB"

      "DefaultDir=c:mydir"

      "FIL=FoxPro 2.5"

      "DriverId=280"))

      在注冊DSN時,SQLConfigDataSource函數的第二個參數應該是ODBC_ADD_DSN,第三個參數指定了ODBC驅動程序,它的寫法可以參照ODBC管理器的驅動程序頁。第四個參數說明了數據源的各種屬性,它是由一系列子串構成,每個子串的末尾必須有一個“”。最重要的屬性是“DSN=數據源名”,其它屬性包括缺省目錄以及驅動程序版本信息。在上例中,使用FoxPro 2.5的版本,所以DriverId應該是280,對應地,FoxPro 2.6的DriverId是536,FoxPro 2.0的是24。

      如果讀者對SQLConfigDataSource函數的第四個參數的設置方法不清楚,那么可以打開Windows的注冊表看一看已注冊過的DSN的各項屬性。運行RegEdit可以打開注冊表,然后依次打開HKEY_CURRENT_USER->Software->ODBC->ODBC.INI,就可以看到已注冊的DSN,打開各DSN,則可以看到該DSN的各項屬性,讀者可以仿照DSN屬性來設置第四個參數。

      的名字必須唯一,因此如果要注冊的DSN已被注冊過,那么SQLConfigDataSource就修改原來DSN的屬性。

      一、ODBC
      開放數據庫連接ODBC(Open Database Connec-tivity)是微軟開放服務結構WOSA中關于數據庫的一
      個重要部分,它允許應用程序通過ODBCAPI訪問不同數據資源中的數據,從而為數據庫編程提供了
      一個標準接口。ODBC是對SQL Access Group的CLI標準的一種實現,它允許應用程序訪問范圍很廣
      的數據庫(從簡單的ASCII文本到復雜的主框架數據庫),除了Windows平臺外,ODBC還可以在其
      他諸如UNIX等的操作平臺上使用,因此ODBC獲得了世界上大多數領先的數據庫和應用程序開發商
      的廣泛支持。
      ODBC主要包括了四層結構:最上層是應用程序,第二層是驅動程序管理器,第三層是不同的驅
      動程序,對應不同的數據庫,最底層是具體的數據源。每個不同的數據資源類型由一個ODBC驅動程
      序支持,這個驅動程序完成了ODBC API程序的核心,而且與數據庫通訊。
      二、一般加表數據源的方法
      通常,開發ODBC應用程序之前必須要手動加入所用的數據源,利用位于控制面板中的ODBC管
      理器可以方便地實現數據庫加載。雙擊控制面板中32-bit ODBC的圖標就會出現管理器對話框,點擊
      Add按鈕加人數據源,選擇使用的驅動程序、數據庫名稱、服務器地址或其他缺省設置后就把數據源
      加載到ODBC管理器中了。ODBC管理器負責安裝驅動程序、管理數據源,幫助程序員跟蹤ODBC的函
      數調用,并能將應用程序的SQL語句及其他消息傳遞給驅動程序,而驅動程序則負責將結果集傳回應
      用程序。
      利用VC++6.0的AppWizard創建一個基于單文檔的工程,選擇數據庫支持并根據提示加人所需
      數據庫,這樣就可以在應用程序中實現對該數據源的增加、修改和刪除等操作了。
      毫無疑問,采用上述方法就能方便地對指定數據庫進行操作。但是,實際運用中,用戶往往要求
      在同一個應用程序中能任意訪問不同的數據源,開發人員無法確定要加載的數據源,采用一般的加載
      方法就有了無法克服的缺陷。顯然,這時就要求動態地進行ODBC數據源加載,用戶只要選擇所需的
      數據源,應用程序就會自動地把它裝載到ODBC管理器。 "
      三、動態加載數據庫
      創建ODBC數據源可以調用Windows系統子目錄下的動態鏈接庫Odbcint.dll中的函數SQLConfigDataSource()
      該函數可以動態地增加、修改和刪除數據源。
      lQLConfigDataSource()函數
      SQLConfigDataSource()的原型如下:
      BOOLSQLConfigDataSource(HWND hwndParent, UINT
      fRequest,LPCSTR IpszDriver, LPCSTR IpszAttributes);
      其中四個參數的用法如下:
      ●參數hwndPwent是父級窗口句柄。如果句柄為NULL,將不會顯示一些有關的對話框。
      如果參數 IpszAttributes提供的信息不夠完善,在創建過程中就會出現對話框要求用戶提供相應信息。
      ●參數fRequest可以設置為下面的數值之一:
      ODBC_ADD_DSN: 增加_個新數據源
      ODBC_CONHG_DSN: 配置(修改)一個已經存在的數據源
      ODBC_REMOVE_DSN: 刪除一個已經存在的數據源
      ODBC_ADD_SYS_DSN:. 增加一個新的系統數據源
      ODBC_CONFIG—SYS—DSN: 更改一個已經存在的系統數據源
      ODBC_REMOVE_SYS_DSN:. 刪除一個已經存在的系統數據源
      ●參數lpszDriver是數據庫引擎名稱,可以參見
      ODBC管理器中對ODBC驅動程序的描述。比如要加
      載的是Excel數據庫,那么數據庫引擎名稱就為Microsoft Excel Driver(*.xls)

      ●參數lpszAttributes為一連串的"KeyName=value"
      字符串,每兩個KeyName值之間用""字符隔開。KeyName主要是新數據源缺省的驅動程序注冊說明,其中最主要的關鍵字是"DSN"----- 新數據源的名稱,其余關鍵字則根據不同的數據源有不同要求。關于lpszAttributes參數的具體設置,詳細可以參考Windows系統目錄下幫助文件Odbcjtn.hlp主題目錄標簽中的"ODBC API函數改變|SQLConfigDatasource"條目。
      2.SqlConfigDataSource的應用條件
      使用SqlConfigDataSource函數之前,必須把
      ODBCINST.H文件包含在工程頭文件中,將ODBC-
      CP32.LIB加人工程,同時保證ODBCCP32.DLL運行時處于系統子目錄下。
      3.SqlConfigDataSource的應用示例
      以下的例子采用SQLConfigDataSource ODBC API函數在VC++6.0下動態加載任意一個Excel數
      據源。
      由于要求是動態地加載數據源,事先沒法手動向ODBC管理器加載數據源,因此無法選擇數據庫
      支持,不能建立基于單文檔或多文檔的應用程序。啟動VC++6.0,利用AppWizard建立一個基于對
      話框的應用程序,工程名稱為"My"。在對話框模板上放置一個按鈕,其ID號為IDC-GETDATA,
      Caption為"調數據源"。再派生出一個基于CFile-Doialg類的新類CMyFileDialog,以標準文件對話框
      方式選擇打開文件,具體做法請參閱有關資料,這里不作說明。
      由于應用程序沒有對數據庫的支持,故必須手工在STDAFX.H文件中加入對數據庫的支持,添加有
      數據庫支持的STDAFX.H文件清單如下所示:

      #define VC-EXTRALEAN
      / / Exclude rarely-used stuff from Windows headers
      #include <afxwin. h>
      //MFC core and standard components
      #include <afxext. h> // MFC extensions
      #include <afxdb. h //MFC database classes
      #include <afxdisp. h> // MFC OLE automation classes
      #ifndef _AFX_NO_AFXCMN- SUPPORT
      #include <afxcmn. h>
      // MFC support for Windows Common Controls
      #endif//- AFX-NO_AFXCMN_SUPPORT
      //{{AFX_Insert_LOCATION}}
      #endif
      利用classwizard給按紐添加函數OnGetData,定位到該函數并添加SqlConfigDataSource()以動態調用數據源,值得指出的是,對于要加載的excel數據源的lpszAttributes參數中有個關鍵字必須要說明,數據源名稱:"DSN"
      主程序如下
      #include"odbcinst.h"
      #include"string.h"
      #include"stdafx.h"
      #include"my.h"
      #include"mydlg.h"
      IMPLEMENT_DYNAMIC ( CMyFileDialog ,CFileDialog)
      CMyFileDialog:: CMyFileDialog ( BOOL bOpenFileDialog,
      LPCTSTR lpszDefExt, LPCTSTR lpszFileName,DWORD
      dwFlags, LPCTSTR lpszFilter, CWnd * pParentWnd):
      CFileDialog (bOpenFileDialog lpszDefExt, lpszFileName,
      dwFlags, lpszFilter, pParentWnd)
      {}
      //CAboutDlg dialog used for App About
      class CAboutDlg :public CDialog

      public:
      CAboutDlg ();
      // Dialog Data
      / / { { AFX DATA I CAboutDlg)
      enum { IDD = IDDABOUTBOX };
      //} }AFX_DATA
      / / ClassWizard generated virtual function overrides
      / / { {AFX VIRTUAL CAboutDlg)
      protected:
      / / Implementation
      protected:
      / / {AFX_MSG (CAboutDlg)
      //}}AFX_MSG
      DECLARE_MESSAGEMAP()

      CAboutDlg: : CAboutDlg() : CDialog(CAboutDlg: : IDD)

      //{{AFX_DATA_INIT(CAboutDlg)
      //})AFX_DATA_INIT

      void CAboutDlg: : DoDataExchange ( CDataExchange * pDX)
      {
      CDialog:: DoDataExchange(pDX);
      //{{AFX_DATA_MAP(CAboutDlg)
      //}}AFX_DATA_MAP
      }
      BEGiN_MESSAGEMAP ( CAboutDlg, CDialog)
      // ( {AFX_MSG_MAP(CAboutDlg)
      / / No message handlers
      //}}AFX_MSG_MAP
      END_MESSAGEMAP()

      / / CMyDlg dialog
      CMyDlg: : CMyDlg(CWnd* pParent / * =NULL* /)
      CDialog(CMyDlg: : IDD, pParent)
      {
      //{{AFX_DATA_INIT(CMyDlg)
      // NOTE: the ClassWizard will add member
      initialization here
      //}}AFX_DATA_NIT
      m_hlcon =AfxGetApp()->Loadlcon(IDR_MAINFRAME);
      }
      void CMyDlg: : DoDataExchange ( CDataExchange * pDX)
      I
      { CDialog:: DoDataExchange(pDX);
      //{{AFX_DATA_MAP(CMyDlg)
      // NOTE: the ClassWizard will add DDX and DDV calls here
      //})AFX_DATA_MAP
      }
      BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
      //{{AFX_MSG_MAP(CMyDIg)
      ON WM_SYSCOMMAND()
      ON_WMPAINT()
      ON WM_QUERYDRAGICON()
      ON_BN_CLICKED(IDC_GETDATA, OnGetdata)

      //}}AFX_MSG_MAP
      END_MESSAGEMAP()

      / / CMyDlg message handlers
      BOOL CMyDlg: : OnlnitDialog()
      {
      CDialog: : OnlnitDialog ();
      ASSERT( (IDM_ABOUTBOX& OxFFFO) = =IDM_ABOUTBOX);
      ASSERT(IDMABOUTBOX < OxF000);
      CMenu * pSysMenu = GetSystemMenu ( FALSE);
      if(pSysMenu!=NULL)
      {CString strAboutMenu;
      strAbooutMenu.LoadString(IDS_ABOUTBOX);
      if(!strAboutMenu.IsEmpty())
      {
      pSysMenu->AppendMenu(MF_SEPARATOR);
      pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
      }
      }
      SetIcon(m.hlcon, TRUE); // Set big icon
      SetIcon ( m.hlcon, FALSE); / / Set small icon
      / / TODO: Add extra initialization here
      return TRUE; / / return TRUE unless you set the focus to a control
      }
      void CMyDlg:: OnSysCommand( UINT nlD, LPARAM
      lParam)
      { if ((nID & OxFFFO) = = 1DM_ABOUTBOX)
      { CAboutDlg dlgAbout;
      dlgAbout. DoModal ();
      }
      else
      {CDialog: : OnSysCommand(nID, lParam);}
      }
      void CMyDlg: : OnPaint()
      {if (lslconic0)
      {CPaintDC dc (this); / / device context for painting
      SendMessage (WM_ICONERASEBKGND, (WPARAM)
      dc.GetSafeHdc0, 0);
      / / Center icon in client rectangle
      int cxIcon = GetSystemMetrics ( SMCXICON);
      int cyIcon = GetSystemMetrics ( SMCYICON);
      CRect rect;
      GetClientRect( & rect);
      int x = (rect.Width() -cxlcon + 1) / 2;
      int y = (rect. Height()-cylcon + 1) / 2;
      // Draw the icon
      dc.Drawlcon(x, y, m_hlcon);
      }


      else
      {CDiaLog: : OnPaint();}
      }
      HCURSOR CMyDlg: : OnQueryDraglcon()
      {return (HCURSOR) m_hIcon;}

      void CMyDlg: OnGetdata ()

      / / TODO: Add your control notification handler code here
      CMyFileDialog filedlg (TRUE);
      filedlg. DoModal (); / /彈出打開對話框
      CString drivername;//數據庫引擎名稱
      CString filetitle = filedlg. GetFileTitle ();
      //取得指定文件名(不包含后綴)
      CString extention =filedlg. GetFileExt();
      / /取得后綴
      if(extention = = "xls")
      drivername = "Microsoft Excel Driver (* xis) ";}
      char str[50];
      strcpy(str, "DSN =");
      CString keyname = strcat( str, filetitle);
      //keyname 指明了數據源名稱
      if (FALSE = = SQLConfigDataSource (NULL, ODBC_
      ADD_DSN, drivername, keyname)
      {MessageBox("加載失敗");}
      else
      {MessageBox("成功將數據源加載到管理器");}
      }
      進行上述編程之后,用戶只要點擊"調數據源"按鈕,在對話框里任意選擇所需Excel數據源,程序就會自動把數據源加載到ODBC管理器而不再需要手動加入,用戶可以通過雙擊"控制面板"中的32位ODBC圖據,查看"用戶DSN"一欄,即可看見數據源己經自動加載到ODBC管理器了。利用動態加載數據庫,用戶還可以多次加載所需數據源,操作起來非常方便靈活,應用程序的處理能力也大大增強了。

      文章版權歸西部工控xbgk所有,未經許可不得轉載。

      主站蜘蛛池模板: 亚洲视频一区二区三区四区| 中文字幕在线无码一区二区三区| 国产一区二区精品| 免费一区二区三区在线视频| 国模吧一区二区三区精品视频| 国产av夜夜欢一区二区三区| 国产日韩综合一区二区性色AV| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 免费精品一区二区三区在线观看| 在线观看国产一区二区三区| 国产福利电影一区二区三区,日韩伦理电影在线福 | 国产一区二区三区免费视频| 久久免费视频一区| 精品一区二区三区东京热| 爆乳无码AV一区二区三区| 亚洲国产精品一区二区三区久久| 久久精品国产一区二区三区肥胖| 极品尤物一区二区三区| 精品一区精品二区| 色欲精品国产一区二区三区AV| 国模一区二区三区| 熟女性饥渴一区二区三区| 最新欧美精品一区二区三区| 久久国产高清一区二区三区| 国产精品亚洲午夜一区二区三区| 一区二区高清视频在线观看| 日韩精品视频一区二区三区| 免费萌白酱国产一区二区| 无码人妻久久一区二区三区免费 | 国产主播福利一区二区| 日韩精品一区二区三区影院| 亚洲福利一区二区精品秒拍| 人成精品视频三区二区一区| 亚洲AV无码一区二区三区牛牛| 国产午夜精品一区二区三区小说 | 国产一区二区三区不卡观| 国产丝袜一区二区三区在线观看| 99精品国产一区二区三区不卡| а天堂中文最新一区二区三区| 亚洲av无码一区二区三区天堂| 精品一区二区三区四区|