VC中應用ADO開辟數據庫運用法式簡明教程。本站提示廣大學習愛好者:(VC中應用ADO開辟數據庫運用法式簡明教程)文章只能為提供參考,不一定能成為您想要的結果。以下是VC中應用ADO開辟數據庫運用法式簡明教程正文
本文實例講述了VC中應用ADO開辟數據庫運用法式的辦法。分享給年夜家供年夜家參考,詳細以下:
1、ADO概述
ADO是Microsoft為最新和最壯大的數據拜訪典范 OLE DB 而設計的,是一個便於應用的運用法式層接口。ADO 使您可以或許編寫運用法式以經由過程 OLE.DB 供給者拜訪和操作數據庫辦事器中的數據。ADO 最重要的長處是易於應用、速度快、內存收入少和磁盤遺址小。ADO 在症結的運用計劃中應用起碼的收集流量,而且在前端和數據源之間應用起碼的層數,一切這些都是為了供給輕量、高機能的接口。之所以稱為 ADO,是用了一個比擬熟習的暗喻,OLE 主動化接口。
OLE DB是一組”組件對象模子”(COM) 接口,是新的數據庫低層接口,它封裝了ODBC的功效,並以同一的方法拜訪存儲在分歧信息源中的數據。OLE DB是Microsoft UDA(Universal Data Access)戰略的技巧基本。OLE DB 為任何數據源供給了高機能的拜訪,這些數據源包含關系和非關系數據庫、電子郵件和文件體系、文本和圖形、自界說營業對象等等。也就是說,OLE DB 其實不局限於 ISAM、Jet 乃至關系數據源,它可以或許處置任何類型的數據,而不斟酌它們的格局和存儲辦法。在現實運用中,這類多樣性意味著可以拜訪駐留在 Excel 電子數據表、文本文件、電子郵件/目次辦事乃至郵件辦事器,諸如 Microsoft Exchange 中的數據。然則,OLE DB 運用法式編程接口的目標是為各類運用法式供給最好的功效,它其實不相符簡略化的請求。您須要的API 應當是一座銜接運用法式和 OLE DB 的橋梁,這就是 ActiveX Data Objects (ADO)。
2、在VC中應用ADO
1、引入ADO庫文件
應用ADO前必需在工程的stdafx.h文件裡用直接引入符號#import引入ADO庫文件,以使編譯器能准確編譯。代碼以下所示:
代碼1:用#import引入ADO庫文件
#import "c:\program files\common files\system\ado\msado15.dll" no_namespaces rename("EOF" adoEOF")
這行語句聲明在工程中應用ADO,但不應用ADO的名字空間,而且為了不常數抵觸,將常數EOF更名為adoEOF。如今不需添加別的的頭文件,便可以應用ADO接口了。
2、初始化OLE/COM庫情況
必需留意的是,ADO庫是一組COM靜態庫,這意味運用法式在挪用ADO前,必需初始化OLE/COM庫情況。在MFC運用法式裡,一個比擬好的辦法是在運用法式主類的InitInstance成員函數裡初始化OLE/COM庫情況。
代碼2:初始化OLE/COM庫情況
BOOL CADOApp::InitInstance() { if(!AfxOleInit()) { AfxMessageBox(“OLE初始化失足!”); return FALSE; } …… }
函數AfxOleInit在每次運用法式啟動時初始化OLE/COM庫情況。
同DAO和CDatabase一樣,ADO由幾個接口構成:
_ConnectionPtr,_CommandPtr和_RecordsetPtr.
分歧於DAO和Cdatabase的是,ADO基於COM的接口,是以,假設你沒有接觸過COM,你應當在應用ADO前先找有關書本懂得一下COM。
3、ADO接口簡介
ADO庫包括三個根本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。
_ConnectionPtr接口前往一個記載集或一個空指針。平日應用它來創立一個數據銜接或履行一條不前往任何成果的SQL語句,如一個存儲進程。應用_ConnectionPtr接口前往一個記載集不是一個好的應用辦法。平日同CDatabase一樣,應用它創立一個數據銜接,然後應用其它對象履行數據輸出輸入操作。
_CommandPtr接口前往一個記載集。它供給了一種簡略的辦法來履行前往記載集的存儲進程和SQL語句。在應用_CommandPtr接口時,你可以應用全局_ConnectionPtr接口,也能夠在_CommandPtr接口裡直接應用銜接串。假如你只履行一次或幾回數據拜訪操作,後者是比擬好的選擇。但假如你要頻仍拜訪數據庫,並要前往許多記載集,那末,你應當應用全局_ConnectionPtr接口創立一個數據銜接,然後應用_CommandPtr接口履行存儲進程和SQL語句。
_RecordsetPtr是一個記載集對象。與以上兩種對象比擬,它對記載集供給了更多的掌握功效,如記載鎖定,游標掌握等。同_CommandPtr接口一樣,它紛歧定要應用一個曾經創立的數據銜接,可以用一個銜接串取代銜接指針賦給_RecordsetPtr的connection成員變量,讓它本身創立數據銜接。假如你要應用多個記載集,最好的辦法是同Command對象一樣應用曾經創立了數據銜接的全局_ConnectionPtr接口,然後應用_RecordsetPtr履行存儲進程和SQL語句。
4、應用_ConnectionPtr接口
_ConnectionPtr是一個銜接接口,它相似於CDatabase和CDaoDatabase。它們的任務道理類似。起首創立一個_ConnectionPtr接話柄例,接著指向並翻開一個ODBC數據源或OLE DB數據供給者(Provider)。以下代碼和CDaoDatabase分離創立一個基於DSN和非DSN的數據銜接。
代碼3:應用CDaoDatabase(基於DSN)
CDaoDatabase MyDb = new CDaoDatabase(); MyDb.Open(NULL,FALSE,FALSE,"ODBC;DSN=samp;UID=admin;PWD=admin");
代碼4:應用CDaoDatabase(基於非DSN)
CDaoDatabase MyDb = new CDaoDatabase(); MyDb.Open(NULL,FALSE,FALSE,"ODBC;DRIVER={SQL Server};SERVER=server; DATABASE=samp;UID=admin;PWD=admin");
代碼5:應用_ConnectionPtr(基於DSN)
_ConnectionPtr MyDb; MyDb.CreateInstance(__uuidof(Connection)); MyDb->Open("DSN=samp;UID=admin;PWD=admin","","",-1);
代碼6:應用_ConnectionPtr (基於非DSN)
_ConnectionPtr MyDb; MyDb.CreateInstance(__uuidof(Connection)); MyDb->Open("Provider=SQLOLEDB;SERVER=server;DATABASE=samp;UID=admin; PWD=admin","","",-1);
5、應用_RecordsetPtr接口
_RecordsetPtr接口的應用辦法和CDaoDatabase相似,經由過程以下代碼的比擬,你會發明應用_RecordsetPtr接口異常簡略(以下代碼應用下面曾經創立的數據銜接):
代碼7:應用CDaoDatabase履行SQL語句
CDaoRecordset MySet = new CDaoRecordset(MyDb); MySet->Open(AFX_DAO_USE_DEFAULT_TYPE,"SELECT * FROM t_samp");
Now using ADO:
代碼8:應用_RecordsetPtr履行SQL語句
_RecordsetPtr MySet; MySet.CreateInstance(__uuidof(Recordset)); MySet->Open("SELECT * FROM some_table", MyDb.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
如今我們曾經有了一個數據銜接和一個記載集,接上去便可以應用數據了。從以下代碼可以看到,應用ADO的_RecordsetPtr接口,就不須要象DAO那樣頻仍地應用年夜而龐雜的數據構造VARIANT,並強迫轉換各類數據類型了,這也是ADO的長處之一。假定法式有一個稱號為m_List的的ListBox控件,上面代碼我們用_RecordsetPtr接口獲得記載集數據並填充這個ListBox控件:
代碼9:應用DAO拜訪數據
VARIANT * vFieldValue; COleVariant covFieldValue; CString Holder; while(!MySet->IsEOF()) { MySet->GetFieldValue("FIELD_1", covFieldValue); vFieldValue = (LPVARIANT)covFieldValue; if(vFieldValue->vt!-VT_NULL) { Holder.Format("%s",vFieldValue->pbVal); m_List.AddString(Holder); } MySet.MoveNext(); }
代碼10:應用ADO拜訪數據
_variant_t Holder try{ while(!MySet->adoEOF) { Holder = MySet->GetCollect("FIELD_1"); if(Holder.vt!=VT_NULL) m_List.AddString((char*)_bstr_t(Holder)); MySet->MoveNext(); } } catch(_com_error * e) { CString Error = e->ErrorMessage(); AfxMessageBox(e->ErrorMessage()); } catch(...) { MessageBox("ADO產生毛病!"); }
必需一直在代碼頂用try和catch來捕捉ADO毛病,不然ADO毛病會使你的運用法式瓦解。當ADO產生運轉時毛病時(如數據庫不存在),OLE DB數據供給者將主動創立一個_com_error對象,並將有關毛病信息填充到這個對象的成員變量.
6、應用_CommandPtr接口
_CommandPtr接口前往一個Recordset對象,而且供給了更多的記載集掌握功效,以下代碼示例了應用_CommandPtr接口的辦法:
代碼11:應用_CommandPtr接口獲得數據
_CommandPtr pCommand; _RecordsetPtr MySet; pCommand.CreateInstance(__uuidof(Command)); pCommand->ActiveConnection=MyDb; pCommand->CommandText="select * from some_table"; pCommand->CommandType=adCmdText; pCommand->Parameters->Refresh(); MySet=pCommand->Execute(NULL,NULL,adCmdUnknown); _variant_t TheValue = MySet->GetCollect("FIELD_1"); CString sValue=(char*)_bstr_t(TheValue);
7、關於數據類型轉換
因為COM對象是跨平台的,它應用了一種通用的辦法來處置各類類型的數據,是以CString 類和COM對象是不兼容的,我們須要一組API來轉換COM對象和C++類型的數據。_vatiant_t和_bstr_t就是如許兩種對象。它們供給了通用的辦法轉換COM對象和C++類型的數據。
8、小結
數據拜訪成長的趨向是OLE DB.應用OLE DB最簡略的辦法是ADO.ADO的對象條理模子封裝了數據庫拜訪細節,為C++法式員供給了一種異常好的數據拜訪戰略。
願望本文所述對年夜家VC++法式設計有所贊助。