什么是DAO Database Access Object
更新時(shí)間:2007年12月07日 21:09:59 作者:
DAO(Database Access Object)使用Microsoft Jet數(shù)據(jù)庫引擎來訪問數(shù)據(jù)庫。
Microsoft Jet為象Access和Visual Basic這樣的產(chǎn)品提供了數(shù)據(jù)引擎。
與ODBC一樣,DAO提供了一組API供編程使用。MFC也提供了一組DAO類,封裝了
底層的API,從而大大簡(jiǎn)化了程序的開發(fā)。利用MFC的DAO類,用戶可以編寫?yīng)毩⒂?
DBMS的應(yīng)用程序。
DAO是從Visual C++4.0版開始引入的。一般地講,DAO類提供了比ODBC類更廣
泛的支持。一方面,只要有ODBC驅(qū)動(dòng)程序,使用Microsoft Jet的DAO就可以訪問
ODBC數(shù)據(jù)源。另一方面,由于DAO是基于Microsoft Jet引擎的,因而在訪問
Access數(shù)據(jù)庫(即*.MDB文件)時(shí)具有很好的性能。
10.8.2 DAO和ODBC的相似之處
DAO類與ODBC類相比具有很多相似之處,這主要有下面幾點(diǎn):
二者都支持對(duì)各種ODBC數(shù)據(jù)源的訪問。雖然二者使用的數(shù)據(jù)引擎不同,但都可以滿
足用戶編寫?yīng)毩⒂贒BMS的應(yīng)用程序的要求。
DAO提供了與ODBC功能相似的MFC類。例如,DAO的CDaoDatabase類對(duì)應(yīng)ODBC的
CDatabase類,CDaoRecordset對(duì)應(yīng)CRecordset,CDaoRecordView對(duì)應(yīng)CRecordView
,CDaoException對(duì)應(yīng)CDBException。這些對(duì)應(yīng)的類功能相似,它們的大部分成員
函數(shù)都是相同的。
AppWizard和ClassWizard對(duì)使用DAO和ODBC對(duì)象的應(yīng)用程序提供了類似的支持。
由于DAO和ODBC類的許多方面都比較相似,因此只要用戶掌握了ODBC,就很容
易學(xué)會(huì)使用DAO。實(shí)際上,用戶可以很輕松地把數(shù)據(jù)庫應(yīng)用程序從ODBC移植到DAO。
Visual C++隨盤提供了一個(gè)名為DaoEnrol的例子,該例實(shí)際上是Enroll的一個(gè)
DAO版本。讀者可以打開DaoEnrol工程看一看,它的源代碼與Enroll的極為相似。
讀者可以按照建立Enroll的步驟來建立DaoEnrol,其中只有若干個(gè)地方有差別,這
主要有以下幾點(diǎn):
選取的數(shù)據(jù)源不同。在用AppWizard創(chuàng)建DaoEnrol時(shí),以及在用ClassWizard創(chuàng)建
CDaoRecordset類的派生類時(shí),在Database Options對(duì)話框中應(yīng)該選擇DAO而不是
ODBC。而且DAO的數(shù)據(jù)源是通過選擇一個(gè).MDB文件來指定的,即點(diǎn)擊“...”按鈕后
在文件對(duì)話框中選擇要訪問的.MDB文件。
記錄集的缺省類型不同。ODBC記錄集的缺省類型是快照(Snapshot),而DAO則是動(dòng)
態(tài)集(Dynaset)。
參數(shù)化的方式不同。DAO記錄集的m_strFilter和m_strSort中的參數(shù)不是“?”號(hào),
而是一個(gè)有意義的參數(shù)名。例如,在下面的過濾器中有一個(gè)名為CourseIDParam的
參數(shù)。
m_pSet->m_strFilter ="CourseID = CourseIDParam";
在DoFieldExchange函數(shù)中,有下面兩行:
pFX->SetFieldType(CDaoFieldExchange::param);
DFX_Text(pFX, _T("CourseIDParam"), m_strCourseIDParam);
DFX函數(shù)的第二個(gè)參數(shù)也是CourseIDParam。
處理異常的方式不同。例如,在刪除記錄時(shí),對(duì)異常的處理如下所示:
try
{
m_pSet->Delete();
}
catch(CDaoException* e)
{
AfxMessageBox(e->
m_pErrorInfo->m_strDescription);
e->Delete();
}
除了上述差別外,AppWizard和ClassWizard也隱藏了一些細(xì)微的不同之處,例
如,DAO記錄集是使用是DFX數(shù)據(jù)交換機(jī)制(DAO record field exchange)而不是
RFX,在DAO記錄集的DoFieldExchange中使用的是DFX函數(shù)而不是RFX函數(shù)。
10.8.3 DAO的特色
DAO可以通過ODBC驅(qū)動(dòng)程序訪問ODBC數(shù)據(jù)源。但DAO是基于Microsoft Jet引擎
的,通過該引擎,DAO可以直接訪問Access、FoxPro、dBASE、Paradox、Excel和
Lotus WK等數(shù)據(jù)庫。CDaoDatabase類可以直接與這些數(shù)據(jù)庫進(jìn)行連接,而不必在
ODBC管理器中注冊(cè)DSN。例如,下面的代碼用來打開一個(gè)FoxPro數(shù)據(jù)庫:
CDaoDatabase daoDb;
daoDb.Open( “”,FALSE,FALSE,"FoxPro 2.5;DATABASE=c:\\zyf");
CDaoDatabase::Open函數(shù)用來連接某個(gè)數(shù)據(jù)庫,該函數(shù)的聲明為:
virtual void Open( LPCTSTR lpszName, BOOL bExclusive = FALSE, BOOL
bReadOnly = FALSE, LPCTSTR lpszConnect = _T("") );
throw( CDaoException, CMemoryException );
參數(shù)bExclusive如果為TRUE,則函數(shù)以獨(dú)占方式打開數(shù)據(jù)庫,否則就用共享方
式。如果bReadOnly為TRUE,那么就以只讀方式打開數(shù)據(jù)庫。如果要打開一個(gè)
Access數(shù)據(jù)庫,則可以在lpszName參數(shù)中指定MDB文件名。如果要訪問非Access數(shù)
據(jù)庫,則應(yīng)使該參數(shù)為“”,并在lpszConnect中說明一個(gè)連接字符串。連接字符
串的形式一般為 “數(shù)據(jù)庫類型;DATABASE=路徑(文件)”,例如 “dBASE III;
DATABASE=c:\\MYDIR”
Open函數(shù)也可以打開一個(gè)ODBC數(shù)據(jù)源,但這需要相應(yīng)的ODBC驅(qū)動(dòng)程序,并需要
在ODBC管理器中注冊(cè)DSN。此時(shí)lpszConnect的形式為 “ODBC;DSN=MyDataSource”
。顯然,用DAO訪問象FoxPro這樣的數(shù)據(jù)庫時(shí),直接打開比把它當(dāng)作ODBC數(shù)據(jù)源打
開要省事。
支持DDL是DAO對(duì)數(shù)據(jù)庫編程良好支持的一個(gè)重要體現(xiàn)。DDL(Data
Definition Language)在SQL術(shù)語中叫做“數(shù)據(jù)定義語言”,它用來完成生成、修
改和刪除數(shù)據(jù)庫結(jié)構(gòu)的操作。ODBC類只支持DML(Data Manipulation Language,數(shù)
據(jù)操作語言),不支持DDL,所以用ODBC類只能完成數(shù)據(jù)的操作,不能涉及數(shù)據(jù)庫的
結(jié)構(gòu)。要執(zhí)行DDL操作,只有通過ODBC API。而DAO類同時(shí)提供了對(duì)DML和DDL的支持
,這意味著程序可以使用DAO類方便的創(chuàng)建數(shù)據(jù)庫及修改數(shù)據(jù)庫的結(jié)構(gòu)。
與ODBC相比,DAO提供了一些新類來加強(qiáng)其功能,這些新類包括:
CDaoTableDef類提供了對(duì)表的結(jié)構(gòu)的定義。調(diào)用CDaoTableDef::Open可以獲得表的
結(jié)構(gòu)定義。調(diào)用CDaoTableDef::Create可以創(chuàng)建一張新表,調(diào)用CDaoTableDef::
CreateField可為表添加字段,調(diào)用CDaoTableDef::CreateIndex可以為表添加索引
。調(diào)用CDaoTableDef::Append可以把新創(chuàng)建的表保存到數(shù)據(jù)庫中。
CDaoQueryDef類代表一個(gè)查詢定義(Query definition),該定義可以被存儲(chǔ)到數(shù)據(jù)
庫中。
CDaoWorkspace提供了數(shù)據(jù)工作區(qū)(Workspace)。一個(gè)工作區(qū)可以包含幾個(gè)數(shù)據(jù)庫,
工作區(qū)可以對(duì)所屬的數(shù)據(jù)庫進(jìn)行全體或單獨(dú)的事務(wù)處理,工作區(qū)也負(fù)責(zé)數(shù)據(jù)庫的安
全性。如果需要,程序可以打開多個(gè)工作區(qū)。
DAO的另一個(gè)重要特色在于它對(duì)Access數(shù)據(jù)庫提供了強(qiáng)大的支持。由于DAO是基
于Microsoft Jet引擎的,所以DAO肯定要在Access數(shù)據(jù)庫上多作一些文章。例如,
調(diào)用CDaoDatabase::Create可以直接建立一個(gè)MDB文件,代碼如下所示:
m_db.Create(“C:\\MYDIR\\MYDB.MDB”);
利用AppWizard和ClassWizard,用戶可以方便地開發(fā)出性能優(yōu)良的基于DAO的
Access數(shù)據(jù)庫應(yīng)用程序。
10.8.4 ODBC還是DAO
由于DAO可以訪問ODBC數(shù)據(jù)源,下面幾條可以作為DAO替代ODBC的理由:
在某些情況下可以獲得更好的性能,特別是在訪問Microsoft Jet(.MDB)數(shù)據(jù)庫
時(shí)。
與ODBC兼容
DAO允許數(shù)據(jù)有效檢查
DAO允許用戶說明表與表之間的關(guān)系
當(dāng)然,DAO的出現(xiàn)并不意味著ODBC已經(jīng)過時(shí)了。如果用戶的工作必須嚴(yán)格限于
ODBC數(shù)據(jù)源,尤其是在開發(fā)Client/Server結(jié)構(gòu)的應(yīng)用程序時(shí),用ODBC有較好的性
能。
Microsoft Jet為象Access和Visual Basic這樣的產(chǎn)品提供了數(shù)據(jù)引擎。
與ODBC一樣,DAO提供了一組API供編程使用。MFC也提供了一組DAO類,封裝了
底層的API,從而大大簡(jiǎn)化了程序的開發(fā)。利用MFC的DAO類,用戶可以編寫?yīng)毩⒂?
DBMS的應(yīng)用程序。
DAO是從Visual C++4.0版開始引入的。一般地講,DAO類提供了比ODBC類更廣
泛的支持。一方面,只要有ODBC驅(qū)動(dòng)程序,使用Microsoft Jet的DAO就可以訪問
ODBC數(shù)據(jù)源。另一方面,由于DAO是基于Microsoft Jet引擎的,因而在訪問
Access數(shù)據(jù)庫(即*.MDB文件)時(shí)具有很好的性能。
10.8.2 DAO和ODBC的相似之處
DAO類與ODBC類相比具有很多相似之處,這主要有下面幾點(diǎn):
二者都支持對(duì)各種ODBC數(shù)據(jù)源的訪問。雖然二者使用的數(shù)據(jù)引擎不同,但都可以滿
足用戶編寫?yīng)毩⒂贒BMS的應(yīng)用程序的要求。
DAO提供了與ODBC功能相似的MFC類。例如,DAO的CDaoDatabase類對(duì)應(yīng)ODBC的
CDatabase類,CDaoRecordset對(duì)應(yīng)CRecordset,CDaoRecordView對(duì)應(yīng)CRecordView
,CDaoException對(duì)應(yīng)CDBException。這些對(duì)應(yīng)的類功能相似,它們的大部分成員
函數(shù)都是相同的。
AppWizard和ClassWizard對(duì)使用DAO和ODBC對(duì)象的應(yīng)用程序提供了類似的支持。
由于DAO和ODBC類的許多方面都比較相似,因此只要用戶掌握了ODBC,就很容
易學(xué)會(huì)使用DAO。實(shí)際上,用戶可以很輕松地把數(shù)據(jù)庫應(yīng)用程序從ODBC移植到DAO。
Visual C++隨盤提供了一個(gè)名為DaoEnrol的例子,該例實(shí)際上是Enroll的一個(gè)
DAO版本。讀者可以打開DaoEnrol工程看一看,它的源代碼與Enroll的極為相似。
讀者可以按照建立Enroll的步驟來建立DaoEnrol,其中只有若干個(gè)地方有差別,這
主要有以下幾點(diǎn):
選取的數(shù)據(jù)源不同。在用AppWizard創(chuàng)建DaoEnrol時(shí),以及在用ClassWizard創(chuàng)建
CDaoRecordset類的派生類時(shí),在Database Options對(duì)話框中應(yīng)該選擇DAO而不是
ODBC。而且DAO的數(shù)據(jù)源是通過選擇一個(gè).MDB文件來指定的,即點(diǎn)擊“...”按鈕后
在文件對(duì)話框中選擇要訪問的.MDB文件。
記錄集的缺省類型不同。ODBC記錄集的缺省類型是快照(Snapshot),而DAO則是動(dòng)
態(tài)集(Dynaset)。
參數(shù)化的方式不同。DAO記錄集的m_strFilter和m_strSort中的參數(shù)不是“?”號(hào),
而是一個(gè)有意義的參數(shù)名。例如,在下面的過濾器中有一個(gè)名為CourseIDParam的
參數(shù)。
m_pSet->m_strFilter ="CourseID = CourseIDParam";
在DoFieldExchange函數(shù)中,有下面兩行:
pFX->SetFieldType(CDaoFieldExchange::param);
DFX_Text(pFX, _T("CourseIDParam"), m_strCourseIDParam);
DFX函數(shù)的第二個(gè)參數(shù)也是CourseIDParam。
處理異常的方式不同。例如,在刪除記錄時(shí),對(duì)異常的處理如下所示:
復(fù)制代碼 代碼如下:
try
{
m_pSet->Delete();
}
catch(CDaoException* e)
{
AfxMessageBox(e->
m_pErrorInfo->m_strDescription);
e->Delete();
}
除了上述差別外,AppWizard和ClassWizard也隱藏了一些細(xì)微的不同之處,例
如,DAO記錄集是使用是DFX數(shù)據(jù)交換機(jī)制(DAO record field exchange)而不是
RFX,在DAO記錄集的DoFieldExchange中使用的是DFX函數(shù)而不是RFX函數(shù)。
10.8.3 DAO的特色
DAO可以通過ODBC驅(qū)動(dòng)程序訪問ODBC數(shù)據(jù)源。但DAO是基于Microsoft Jet引擎
的,通過該引擎,DAO可以直接訪問Access、FoxPro、dBASE、Paradox、Excel和
Lotus WK等數(shù)據(jù)庫。CDaoDatabase類可以直接與這些數(shù)據(jù)庫進(jìn)行連接,而不必在
ODBC管理器中注冊(cè)DSN。例如,下面的代碼用來打開一個(gè)FoxPro數(shù)據(jù)庫:
CDaoDatabase daoDb;
daoDb.Open( “”,FALSE,FALSE,"FoxPro 2.5;DATABASE=c:\\zyf");
CDaoDatabase::Open函數(shù)用來連接某個(gè)數(shù)據(jù)庫,該函數(shù)的聲明為:
virtual void Open( LPCTSTR lpszName, BOOL bExclusive = FALSE, BOOL
bReadOnly = FALSE, LPCTSTR lpszConnect = _T("") );
throw( CDaoException, CMemoryException );
參數(shù)bExclusive如果為TRUE,則函數(shù)以獨(dú)占方式打開數(shù)據(jù)庫,否則就用共享方
式。如果bReadOnly為TRUE,那么就以只讀方式打開數(shù)據(jù)庫。如果要打開一個(gè)
Access數(shù)據(jù)庫,則可以在lpszName參數(shù)中指定MDB文件名。如果要訪問非Access數(shù)
據(jù)庫,則應(yīng)使該參數(shù)為“”,并在lpszConnect中說明一個(gè)連接字符串。連接字符
串的形式一般為 “數(shù)據(jù)庫類型;DATABASE=路徑(文件)”,例如 “dBASE III;
DATABASE=c:\\MYDIR”
Open函數(shù)也可以打開一個(gè)ODBC數(shù)據(jù)源,但這需要相應(yīng)的ODBC驅(qū)動(dòng)程序,并需要
在ODBC管理器中注冊(cè)DSN。此時(shí)lpszConnect的形式為 “ODBC;DSN=MyDataSource”
。顯然,用DAO訪問象FoxPro這樣的數(shù)據(jù)庫時(shí),直接打開比把它當(dāng)作ODBC數(shù)據(jù)源打
開要省事。
支持DDL是DAO對(duì)數(shù)據(jù)庫編程良好支持的一個(gè)重要體現(xiàn)。DDL(Data
Definition Language)在SQL術(shù)語中叫做“數(shù)據(jù)定義語言”,它用來完成生成、修
改和刪除數(shù)據(jù)庫結(jié)構(gòu)的操作。ODBC類只支持DML(Data Manipulation Language,數(shù)
據(jù)操作語言),不支持DDL,所以用ODBC類只能完成數(shù)據(jù)的操作,不能涉及數(shù)據(jù)庫的
結(jié)構(gòu)。要執(zhí)行DDL操作,只有通過ODBC API。而DAO類同時(shí)提供了對(duì)DML和DDL的支持
,這意味著程序可以使用DAO類方便的創(chuàng)建數(shù)據(jù)庫及修改數(shù)據(jù)庫的結(jié)構(gòu)。
與ODBC相比,DAO提供了一些新類來加強(qiáng)其功能,這些新類包括:
CDaoTableDef類提供了對(duì)表的結(jié)構(gòu)的定義。調(diào)用CDaoTableDef::Open可以獲得表的
結(jié)構(gòu)定義。調(diào)用CDaoTableDef::Create可以創(chuàng)建一張新表,調(diào)用CDaoTableDef::
CreateField可為表添加字段,調(diào)用CDaoTableDef::CreateIndex可以為表添加索引
。調(diào)用CDaoTableDef::Append可以把新創(chuàng)建的表保存到數(shù)據(jù)庫中。
CDaoQueryDef類代表一個(gè)查詢定義(Query definition),該定義可以被存儲(chǔ)到數(shù)據(jù)
庫中。
CDaoWorkspace提供了數(shù)據(jù)工作區(qū)(Workspace)。一個(gè)工作區(qū)可以包含幾個(gè)數(shù)據(jù)庫,
工作區(qū)可以對(duì)所屬的數(shù)據(jù)庫進(jìn)行全體或單獨(dú)的事務(wù)處理,工作區(qū)也負(fù)責(zé)數(shù)據(jù)庫的安
全性。如果需要,程序可以打開多個(gè)工作區(qū)。
DAO的另一個(gè)重要特色在于它對(duì)Access數(shù)據(jù)庫提供了強(qiáng)大的支持。由于DAO是基
于Microsoft Jet引擎的,所以DAO肯定要在Access數(shù)據(jù)庫上多作一些文章。例如,
調(diào)用CDaoDatabase::Create可以直接建立一個(gè)MDB文件,代碼如下所示:
m_db.Create(“C:\\MYDIR\\MYDB.MDB”);
利用AppWizard和ClassWizard,用戶可以方便地開發(fā)出性能優(yōu)良的基于DAO的
Access數(shù)據(jù)庫應(yīng)用程序。
10.8.4 ODBC還是DAO
由于DAO可以訪問ODBC數(shù)據(jù)源,下面幾條可以作為DAO替代ODBC的理由:
在某些情況下可以獲得更好的性能,特別是在訪問Microsoft Jet(.MDB)數(shù)據(jù)庫
時(shí)。
與ODBC兼容
DAO允許數(shù)據(jù)有效檢查
DAO允許用戶說明表與表之間的關(guān)系
當(dāng)然,DAO的出現(xiàn)并不意味著ODBC已經(jīng)過時(shí)了。如果用戶的工作必須嚴(yán)格限于
ODBC數(shù)據(jù)源,尤其是在開發(fā)Client/Server結(jié)構(gòu)的應(yīng)用程序時(shí),用ODBC有較好的性
能。
相關(guān)文章
三條命令搞定Winload.exe出現(xiàn)0xc000000e錯(cuò)誤
三條命令搞定Winload.exe出現(xiàn)0xc000000e錯(cuò)誤...2007-05-05Macromedia Captivate影片中完美加入閃吧版權(quán)信息
Macromedia Captivate影片中完美加入閃吧版權(quán)信息...2007-02-02Google AdSense今日開放西聯(lián)匯款 大大加快匯款速度 就是托收成本比托收多了幾十
Google AdSense今日開放西聯(lián)匯款 大大加快匯款速度 就是托收成本比托收多了幾十...2007-09-09217個(gè)電腦知識(shí)和實(shí)用問題解決集錦
217個(gè)電腦知識(shí)和實(shí)用問題解決集錦...2007-02-02