如何在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管理器了。利用動態加載數據庫,用戶還可以多次加載所需數據源,操作起來非常方便靈活,應用程序的處理能力也大大增強了。
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所有,未經許可不得轉載。