程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> VC中應用ADO開辟數據庫運用法式簡明教程

VC中應用ADO開辟數據庫運用法式簡明教程

編輯:關於C++

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++法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved