中科永聯高級技術培訓中心(www.itisedu.com)
DAO (Data Access Objects) 數據訪問對象是第一個面向對象的接口,它顯露了 Microsoft Jet 資料庫引擎(由 Microsoft Access 所使用),並允許 Visual Basic 開發者通過 ODBC 象直接連線到其他資料庫一樣,直接連線到 Access 表。DAO 最適用於單系統套用程式或小範圍本地分布使用。
DAO就是Database Access Objects,數據訪問對象的英文縮寫。在VB中提供了兩種與JET資料庫引擎接口的方法:Data控制項和數據訪問對象(DAO)。Data控制項只給出有限的不需編程而能訪問現存資料庫的功能,而DAO模型則是全面控制資料庫的完整編程接口。Data控制項將常用的DAO功能封裝在其中,它與DAO控制項的關係就好象記憶體與CACHE之間的關係一樣,所以這兩種方法並不是互斥的,實際上,它們常同時使用。
DAO數據訪問對象(DataAccessObjects)是一種面向對象的界面接口。通過DAO/Jet功能可以訪問ISAM資料庫,使用DAO/ODBCDirect功能可以實現遠程RDO功能。使用DAO的程式編碼非常簡單,DAO提供豐富的游標(Cursor)類型的結果集和非游標(Cursor-Less)類型的結果集,同DDL(數據描述語言)的功能很類似。現在vb資料庫編程大都使用ADO,很少人還用DAO.
DAO是集合,對象,方法和屬性;它用對象集合來處理資料庫,表,視圖和索引等。使用DAO編程,可以訪問並運算元據庫,管理資料庫的對象和定義資料庫的結構等。
DAO模型是設計關係資料庫系統結構的對象類的集合。它們提供了完成管理一個關係型資料庫系統所需的全部操作的屬性和方法,這其中包括創建資料庫,定義表、欄位和索引,建立表間的關係,定位和查詢資料庫等。
Visual Basic中的資料庫編程就是創建數據訪問對象,這些數據訪問對象對應於被訪問物理資料庫的不同部分,如資料庫、表、欄位和索引等,同時用這些對象的屬性和方法來實現對資料庫的操作,以便在Visual Basic窗體中使用綁定和非綁定控制項來顯示操作結果並接收用戶輸入。
Visual Basic通過DAO和Jet引擎可以識別三類資料庫:
■ VisualBasic資料庫
也就是*.MDB資料庫
■ 外部資料庫
它們是使用幾種流行格式的“索引順序訪問方法(ISAM)”資料庫,這些流行格式包括Btrieve、dBASEIII、dBASEIV、Microsoft FoxPro versions2.0和2.5以及Paradox versions 3.x和4.0。在Visual Basic中能夠創建和操作所有以上格式的資料庫。也可以訪問文本檔案資料庫和Microsoft Excel或Lotus1-2-3電子表格。
■ ODBC資料庫
包括符合ODBC標準的客戶/伺服器資料庫,如Microsoft SQL Server。要在Visual Basic中創建真正的客戶/伺服器應用程式,可以使用ODBC Direct直接把命令傳遞給伺服器處理。也就是說Visual Basic還支持其它不使用Jet資料庫引擎的數據訪問方法。數據訪問對象的ODBC Direct模式允許使用同樣的對象模型和語法繞過Jet引擎直接訪問ODBC數據。
由上面的敘述可知,對於編程人員來講,你只須了解DAO的使用,對具體的資料庫系統無須做深入的探討,就可對幾乎任何一種資料庫進行操作,“以不便應萬變”, 而對資料庫檔案自身的物理操作,將由相應的資料庫引擎把數據訪問對象上的這些操作轉換為對資料庫檔案自身的物理操作,這些引擎來處理所有與各種資料庫的接口。
一、數據訪問對象DAO的結構
上一章我們知道了DAO是什麼,它可以乾什麼,以及簡單的了解了它是如何實現這一功能,這一章我們講逐步學習DAO的結構。在將講這一章之前,首先講兩個題外話:
大家對面向對象編程一定不陌生,但究竟什麼是面向對象編程,很多人一下子也說不出個所以然來;在VB的DAO中又是如何體現面向對象的呢,恐怕即便是使用了一段VB的網友也很難說清。這也難怪,VB本身並不是個完全的面向對象的編程環境,它的很多如動態數組等就不是面向對象的,但在DAO中是完全的面向對象的。其實面向對象的最初思想就是將數據和操作封裝在一起,形成對象,而在DAO中正是體現了這一點,它將數據的值作為屬性,數據的查詢作為方法,數據值的變化作為事件,完全封裝在DAO對象中,希望諸位盟友在使用中注意,逐步領悟面向對象的編程方法。
資料庫前端開發系統和後台系統
經常由朋友說他會DELPHI,會PB,實際上用前端和後台的概念來看,他們都只是會一種前端開發工具而已,嚴格說起來並不能算會資料庫的開發。人們往往只看到前台套用的功能而忽視了後台系統的套用,或者認為這兩者根本就是一回事。前端後台概念用在單機上,就是VB與Access,用在網路中就是VB與SQL Sever,只會VB或DELPHI是不能稱為掌握資料庫編程的,而且在編程中,要善於利用後台資料庫提供功能,這樣的程式運行起來更快,程式更精練。
題外話講完,現在切入正題。DAO的結構如圖所示:
以上是DAO整體結構圖,下面將分章節逐步講述每個對象的使用
二、數據訪問對象DAO的功能
1. DAO用來封裝Data Source的..就比如,Connection conn = DAOFacotry.createConnection()..
就可以把Driver. URL. username, passpword這一些放在DAO中
以後要更改資料庫的類型.比如要把MSSQL換成Oracle的話..只需要更改DAOFacory裡面的getConnection()裡面的Driver.URL.之類的..
2. DAO也是把對資料庫的操作(比如最基本的CRUD操作)全部封裝在裡面..
比如說你要你要插入一個新的用戶..那么.在DAO中我們只需要提供一個insertUser(User user)這一個方法就可以了..具體的操作是在DAO中實現的...
那么對於要調用DAO的時候.我們只要知道insertUser(User)是用來插入一個新的用戶...而不需要知道是如何實現的..
一般 DAO是與Abstract factory模式一起來用的...
Factory來建立資料庫和定位具體的DAO(比如說是UserDao..CustomerDao..)..一般將getConnection設定為static..也可以把HibernateSessionFactory這一個公共類放在這一AbstractFactory類中去...
public class DAOFactory {
private static final SessionFactory sessionFacotory;
// 定義一個TrheadLocal .
static Session currentSession().....
public UserDao getUserDAO() { return new UserDaoImpl(sesssion);}
pulbic OtherDao getOtherDAO() { return new OtherDaoImpl(session);}
......
}
public interface UserDao {
public insertUser(FormBean)
public updateUser(FormBean);
}
然後就實現DAO的接口: (Struts的FormBean...VO來的..)
public class UserDaoImpl implements UserDao {
privateSession session;
public UserDaoImpl(Session session){
this.session = session;
}...
public insertUser(FormBean) {
..//..
session.save(UserPO);
..//..
return FormBean;
}
public FormBean updateUser(FormBean) {
..//..
session.update(UserPO);
..//..
return FormBean;
}
}
最後定義你的PO:
public class UserPO {
String firstname, lastname, password..........
}
Huhmmmm..........
(Copyright 2003-2005 www.sohozu.com All Rights Reserved)
三、實戰套用——使用數據訪問對象DAO
1 概述
Visual C++提供了對DAO的封裝,MFC DAO類封裝了DAO(資料庫訪問對象)的大部分功能,從面Visual C++程式就可以使用Visual C++提供的MFC DAO類方便的訪問Microsoft Jet 資料庫,編制簡潔、有Visaul C++特色的資料庫應用程式。
資料庫訪問對象(DAO)提供了一種通過程式代碼創建和操縱資料庫的機制。多個DAO對象構成一個體系結構,在這個結構里,各個DAO對象協同工作。DAO支持以下四個資料庫選項:
打開訪問資料庫(MDB檔案)——MDB檔案是一個自包含的資料庫,它包括查詢定義、安全信??須指定MDB檔案的路徑名。
直接打開ODBC數據源——這裡有一個很重要的限制。不能找開以Jet引擎作為驅動程式的ODBC數據源;只可以使用具有自己的ODBC驅動程式DLL的數據源。
用Jet引擎找開ISAM型(索引順序訪問方法)數據源(包括dBase,FoxPro,Paradox,Btrieve,Excel或文本檔案)——即使已經設定了ODBC數據源,要用Jet引擎來訪問這些檔案類型中的一種,也必須以ISAM型數據源的方式來找開檔案,而不是以ODBC數據源的方式。
給ACCESS資料庫附加外部表——這實際上是用DAO訪問ODBC數據源的首選方法。首先使用ACCESS把ODBC表添加到一個MDB檔案上,然後依照第一選項中介紹的方法用DAO找開這個MDB檔案就可以了。用戶也可以用ACCESS把IASM檔案附加到一個MDB檔案上。
2 套用DAO編程
2.1 打開資料庫
CDaoWorkspace對象代表一個DAO Workspace對象,在MFC DAO體系結構中處於最高處,定義了一個用戶的同資料庫的會話,並包含打開的資料庫,負責完成資料庫的事務處理。我們可以使用隱含的workspace對象。
CDaoDatabase對象代表了一個到資料庫的連線,在MFC中,是通過CDaoDatabase封裝的。
在構造CDaoDatabase對象時,有如下兩種方法:
創建一個CDaoDatabase對象,並向其傳遞一個指向一個已經找開的CdaoWorkspace對象的指針。
創建一個CDaoDatabase對象,而不明確地指定使用的workspace,此時,MFC將創建一個新的臨時的CDaoWorkspace對象。
如下代碼所示:
CDaoDatabase db;
db.Open(“test.mdb”,FALSE,FALSE,_T(“”);
其中參數一包括要打開的檔案的全路徑名。
2.2 查詢記錄
一個DAO recordset對象,代表一個數據記錄的集合,該集合是一個庫表或者是一個查詢的運行結果中的全部記錄。CDaoRecorset對象有三種類型:表、動態集、快照。
通常情況下,我們在應用程式中可以使用CDaoRecordset的導出類,這一般是通過ClassWizard或AppWizard來生成的。但我們也可以直接使用CDaoRecordset類生成的對象。此時,我們可以動態地綁定recordset對象的數據成員。
如下代碼所示:
COleVariant var;
long id;
CString str;
CDaoRecordset m_Set(&db);
m_Set.Open(“查詢的SQL語句”);
while(!m_Set.IsEOF())
{
/*
處理
m_Set.GetFieldValue(“ID”,var);
id=V_I4(var);
m_Set.GetFieldValue(“Name”,var);
str=var.pbVal;
*/
m_Set.MoveNext();
}
m_Set.Close();
2.3 添加記錄
添加記錄用AddNew函式,此時用SetFieldValue來進行賦值。
如下代碼所示:
m_pDaoRecordset->AddNew ();
sprintf(strValue,"%s",>m_UserName );
m_pDaoRecordset->SetFieldValue ("UserName",strValue);
sprintf(strValue,"%d",m_PointId );
m_pDaoRecordset->SetFieldValue ("PointId",strValue);
dataSrc.SetDateTime (m_UpdateTime .GetYear ), m_UpdateTime .GetMonth ), m_UpdateTime .GetDay (),
m_UpdateTime .GetHour (),m_UpdateTime .GetMinute (),m_UpdateTime .GetSecond ());
valValue=dataSrc;
m_pDaoRecordset->SetFieldValue ("UpdateTime",valValue);
sprintf(strValue,"%f",m_pRecordset->m_OldValue );
m_pDaoRecordset->SetFieldValue ("OldValue",strValue);
sprintf(strValue,"%f",m_pRecordset->m_NewValue );
m_pDaoRecordset->SetFieldValue ("NewValue",strValue);
m_pDaoRecordset->Update ();
此時,要注意,日期時間型數據要用SetDataTime函式來賦值,這裡面要用到COleVariant類型數據,具體用法可以參考有關幫助。
2.4 修改記錄
修改記錄用Edit()函式,把記錄定位到要修改的位置,調用Edit函式,修改完成後,調用Update函式。
如下代碼所示:
m_Set.Edit();
m_Set.SetFieldValue(“列名”,”字元串”);
m_Set.Update();
2.5 刪除記錄
刪除記錄用Delete()函式,使用後不需調用Update()函式。
2.6 統計記錄
可以使用如下代碼來統計記錄數:
COleVariant varValue;
CDaoRecordset m_Set(&db);
m_Set.Open(dbOpenDynaset,”SQL語句”);
varValue=m_Set.GetFieldValue(0);
m_lMaxCount=V_I4(&varValue);
m_Set.Close();
如果是統計一張表中總記錄,可以使用CDaoTableDef對象,如下代碼所示:
CDaoTableDef m_Set(&gUseDB);
Count=m_Set.GetRecordCount();
m_Set.Close();
不能用CDaoRecordset對象的GetRecordCount()來取得記錄數。
3 總結
使用DAO技術可以便我們方便的訪問Microsoft Jet引擎資料庫,由於Microsoft Jet不支持多執行緒,因此,必須限制調用到應用程式主執行緒的所有DAO。(來源CNET Networks )