古詩詞大全網 - 漢語詞典 - ado,dao,odbc各自的優缺點是什麽?現在哪個比較普遍,比較有前景?

ado,dao,odbc各自的優缺點是什麽?現在哪個比較普遍,比較有前景?

ADO

來自ITwiki,開放的中文IT百科

Jump to: navigation, <jumptoSearch>

微軟公司的ADO (ActiveX Data Objects) 是壹個用於存取數據源的COM組件。它提供了編程語言和統壹數據訪問方式OLE DB的壹個中間層。允許開發人員編寫訪問數據的代碼而不用關心數據庫是如何實現的,而只用關心到數據庫的連接。訪問數據庫的時候,關於SQL的知識不是必要的,但是特定數據庫支持的SQL命令仍可以通過ADO中的命令對象來執行。

ADO被設計來繼承微軟早期的數據訪問對象層,包括RDO (Remote Data Objects) 和DAO(Data Access Objects)。ADO在1996年冬被發布。

ADO包含壹些頂層的對象:

連接,代表到數據庫的連接

記錄集,代表數據庫記錄的壹個集合

命令,代表壹個SQL命令

記錄,代表數據的壹個集合

流,代表數據的順序集合

錯誤,代表數據庫訪問中產生的意外

字段,代表壹個數據庫字段

參數,代表壹個SQL參數

屬性,保存對象的信息

ADO組件的使用需要利用支持COM的高級語言,例如ASP中的VBScript或者Visual Basic,甚至Delphi,微軟的競爭對手Borland的壹個產品,現在也支持使用ADO來訪問數據庫。

在新的編程框架.NET Framework中, 微軟也提供了壹個面向Internet的版本的ADO,稱為ADO.NET。其對象模型和傳統ADO差別很大。

DAO

DAO(Database Access Object)使用Microsoft Jet數據庫引擎來訪問數據庫。Microsoft Jet為象Access和Visual Basic這樣的產品提供了數據引擎。

與ODBC壹樣,DAO提供了壹組API供編程使用。MFC也提供了壹組DAO類,封裝了底層的API,從而大大簡化了程序的開發。利用MFC的DAO類,用戶可以編寫獨立於DBMS的應用程序。

DAO是從Visual C++4.0版開始引入的。壹般地講,DAO類提供了比ODBC類更廣泛的支持。壹方面,只要有ODBC驅動程序,使用Microsoft Jet的DAO就可以訪問ODBC數據源。另壹方面,由於DAO是基於Microsoft Jet引擎的,因而在訪問Access數據庫(即*.MDB文件)時具有很好的性能。

DAO和ODBC的相似之處

DAO類與ODBC類相比具有很多相似之處,這主要有下面幾點:

二者都支持對各種ODBC數據源的訪問。雖然二者使用的數據引擎不同,但都可以滿足用戶編寫獨立於DBMS的應用程序的要求。

DAO提供了與ODBC功能相似的MFC類。例如,DAO的CDaoDatabase類對應ODBC的CDatabase類,CDaoRecordset對應CRecordset,CDaoRecordView對應CRecordView,CDaoException對應CDBException。這些對應的類功能相似,它們的大部分成員函數都是相同的。

AppWizard和ClassWizard對使用DAO和ODBC對象的應用程序提供了類似的支持。

由於DAO和ODBC類的許多方面都比較相似,因此只要用戶掌握了ODBC,就很容易學會使用DAO。實際上,用戶可以很輕松地把數據庫應用程序從ODBC移植到DAO。

Visual C++隨盤提供了壹個名為DaoEnrol的例子,該例實際上是Enroll的壹個DAO版本。讀者可以打開DaoEnrol工程看壹看,它的源代碼與Enroll的極為相似。讀者可以按照建立Enroll的步驟來建立DaoEnrol,其中只有若幹個地方有差別,這主要有以下幾點:

選取的數據源不同。在用AppWizard創建DaoEnrol時,以及在用ClassWizard創建CDaoRecordset類的派生類時,在Database Options對話框中應該選擇DAO而不是ODBC。而且DAO的數據源是通過選擇壹個.MDB文件來指定的,即點擊“...”按鈕後在文件對話框中選擇要訪問的.MDB文件。

記錄集的缺省類型不同。ODBC記錄集的缺省類型是快照(Snapshot),而DAO則是動態集(Dynaset)。

參數化的方式不同。DAO記錄集的m_strFilter和m_strSort中的參數不是“?”號,而是壹個有意義的參數名。例如,在下面的過濾器中有壹個名為CourseIDParam的參數。

m_pSet->m_strFilter ="CourseID = CourseIDParam";

在DoFieldExchange函數中,有下面兩行:

pFX->SetFieldType(CDaoFieldExchange::param);

DFX_Text(pFX, _T("CourseIDParam"), m_strCourseIDParam);

DFX函數的第二個參數也是CourseIDParam。

處理異常的方式不同。例如,在刪除記錄時,對異常的處理如下所示:

try

{

m_pSet->Delete();

}

catch(CDaoException* e)

{

AfxMessageBox(e->

m_pErrorInfo->m_strDescription);

e->Delete();

}

除了上述差別外,AppWizard和ClassWizard也隱藏了壹些細微的不同之處,例如,DAO記錄集是使用是DFX數據交換機制(DAO record field exchange)而不是RFX,在DAO記錄集的DoFieldExchange中使用的是DFX函數而不是RFX函數。

10.8.3 DAO的特色

DAO可以通過ODBC驅動程序訪問ODBC數據源。但DAO是基於Microsoft Jet引擎的,通過該引擎,DAO可以直接訪問Access、FoxPro、dBASE、Paradox、Excel和Lotus WK等數據庫。CDaoDatabase類可以直接與這些數據庫進行連接,而不必在ODBC管理器中註冊DSN。例如,下面的代碼用來打開壹個FoxPro數據庫:

CDaoDatabase daoDb;

daoDb.Open( “”,FALSE,FALSE,"FoxPro 2.5;DATABASE=c:\\zyf");

CDaoDatabase::Open函數用來連接某個數據庫,該函數的聲明為:

virtual void Open( LPCTSTR lpszName, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T("") );

throw( CDaoException, CMemoryException );