VC++ ADO開發實踐之六 (轉)
在Visual C++中用ADO進行
作者:蔣東宇
資料(ADO)是OLE 上面的高層資料庫。我們在C++中也可以ADO。本文將在6.0環境下做一個小小的例子解釋如何使用ADO。
1. 生成應用程式並初始化OLE/COM庫環境
建立一個標準的MFC AppWizard(exe)應用程式,然後在應用程式類的InitInstance中初始化OLE/COM庫(因為ADO庫是一個DLL庫)。
BOOL CADOTestApp::InitInstance()
{ //初始化OLE/COM庫環境
AfxOleInit();}
2. 引入ADO庫
使用ADO前必須在工程的stdafx.h檔案裡用直接引入符號#import引入ADO庫檔案,以使能正確編譯。程式碼如下:
#include 〈comdef.h〉
#import "c:program filescommon filessystemadomsado15.dll"
no_namespace
rename ("EOF","adoEOF")
標頭檔案comdef.h使我們的應用程式能夠使用Visual C++中的一些特殊COM支援類,這些類使得處理OLE自治更為容易一些,OLE自治是ADO使用的資料型別。後三行使用#import指令在我們的應用程式中輸入ADO類庫定義。
ADO類的定義是作為一種資源在ADO DLL(msado15.dll)中,在其內部稱為型別庫。型別庫描述了自治介面,以及C++使用的COM vtable介面。當使用#import指令時,在執行時Visual C++需要從ADO DLL中讀取這個型別庫,並以此建立一組C++標頭檔案。這些標頭檔案具有.tli 和.tlh副檔名,讀者可以在專案的目錄下找到這兩個檔案。在C++程式程式碼中呼叫的ADO類要在這些檔案中定義。
程式的第三行指示ADO物件不使用名稱空間。在有些應用程式中,由於應用程式中的物件與ADO中的物件之間可能會出現命名衝突,所以有必要使用名稱空間。如果要使用名稱空間,則可把第三行程式修改為: rename_namespace("AdoNS")。第四行程式碼將ADO中的EOF(檔案結束)更名為adoEOF,以避免與定義了自己的EOF的其他庫衝突。
3.利用智慧指標進行資料庫操作
在CaboutDlg標頭檔案中定義兩個ADO智慧指標類例項,並在對話方塊中加入一個ListCtrl。
_ConnectionPtr m_pConnection;
_RecordsetPtr m_pRecordset;
ClistCtrl m_List;
ADO庫包含三個智慧指標:_ConnectionPtr、_CommandPtr和_RecordsetPtr。
_ConnectionPtr通常被用來建立一個資料連線或一條不返回任何結果的語句,如一個。
_CommandPtr返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的儲存過程和SQL語句。在使用_CommandPtr介面時,可以利用全域性_ConnectionPtr介面,也可以在_CommandPtr介面裡直接使用連線串。
_RecordsetPtr是一個記錄集物件。與以上兩種物件相比,它對記錄集提供了更多的控制功能,如記錄鎖定、遊標控制等。
在OnInitDialog()中加入以下程式碼:
BOOL CAboutDlg::OnInitDialog()
{
CDialog::OnInitDialog();
_variant_t TheValue;
m_List.ResetContent();
m_pConnection.CreateInstance(_uuidof(Connection));
m_pRecordset.CreateInstance(_uuidof(Recordset));
try{
m_pConnection->Open("DSN=ADOTest","","",0); //連線叫作ADOTest的ODBC資料來源
m_pRecordset->Open(" * FROM BlockDefine",(IDispatch*)m_pConnection,
adOpenDynamic,
adLockOptimistic,
adCmdText);
//執行SQL語句得到一個記錄集
while(!m_pRecordset->adoEOF)
//遍歷所有記錄
{
TheValue = m_pRecordset->GetCollect("BlockIndex");
//得到欄位BlockIndex的值
if(TheValue.vt!=VT_NULL)
m_List.AddString((char*)_bstr_t(TheValue)); //將該值加入到列表中
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
m_pConnection->Close();
}
catch(_com_error e) //異常處理
{
AfxMessageBox(e->ErrorMessage());
}
m_pRecordset = NULL;
m_pConnection = NULL;
return TRUE; // return TRUE unless you set the focus to a control
}
程式中透過_variant_t和_bstr_t轉換COM物件和C++型別的資料, _variant_t類封裝了OLE自治VARIANT資料型別。在C++中使用_variant_t類要比直接使用VARIANT資料型別容易得多。
好,編譯後該程式就能執行了,但記住執行前要建立一個叫ADOTest的ODBC資料來源。該程式將把表BlockDefine中的BlockIndex欄位值顯示在列表控制元件中。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963062/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VC++ ADO開發實踐之五 (轉)C++
- VC++ ADO開發實踐之四 (轉)C++
- VC++ ADO開發實踐之七 (轉)C++
- VC++ ADO開發實踐之三 (轉)C++
- BouncyCastle JCE實踐(六) (轉)AST
- VC++串列埠程式設計之簡訊應用開發(轉)C++串列埠程式設計
- ADO 開發指南
- 資料庫綜合開發實踐 (轉)資料庫
- IOS開發基礎篇之──Object-C 實踐Queue容器【轉】iOSObject
- Golang 高效實踐之併發實踐Golang
- 敏捷開發實踐之Scrum方法運用敏捷Scrum
- 利用VC++開發所見即所得的列印程式 (轉)
- 再談在VB中呼叫VC++開發的DLL (轉)C++
- 優酷鴻蒙開發實踐|多屏互動開發實踐鴻蒙
- webpack與SPA實踐之開發環境搭建Web開發環境
- EyeDropper 開發實踐
- Docker進階與實踐之六:容器卷管理Docker
- VC++ 開發非常漂亮的介面C++
- DevOps最佳實踐之應用開發和部署dev
- Material Design之 AppbarLayout 開發實踐總結Material DesignAPP
- 【機器學習PAI實踐六】金融貸款發放預測機器學習AI
- Golang 高效實踐之併發實踐context篇GolangContext
- kubernetes實踐之六:CFSSL構建本地CA
- Laravel 開發最佳實踐Laravel
- Laradock 開發實踐
- iOS開發-Block實踐iOSBloC
- JavaScript 開發最佳實踐JavaScript
- REST開發最佳實踐REST
- Flutter(六)之Flutter開發初體驗Flutter
- win7 64 VC++ ado方式連線access 連線字串Win7C++字串
- Docker生產實踐(六)Docker
- [敏捷開發實踐](0) 開始敏捷
- Scrum敏捷軟體開發之技術實踐——測試驅動開發TDDScrum敏捷
- VC++中實現程式互斥執行 (轉)C++
- VC++實現撥號上網程式 (轉)C++
- 彼之蜜糖,吾之砒霜——聊聊軟體開發中的最佳實踐
- 彼之蜜糖,吾之砒霜 —— 聊聊軟體開發中的最佳實踐
- iOS開發實踐-OOM治理iOSOOM