吳東明 王麗娟
摘要:DataSet是ADO.NET兩大組件之一,程序員在使用DataSet在開發(fā)中往往會(huì)出現(xiàn)編程復(fù)雜、容易出錯(cuò)并且調(diào)試?yán)щy等問題,該文通過研究TypedDataSet的應(yīng)用,探討了TypedDataSet的優(yōu)點(diǎn)、開發(fā)方法與使用技巧,以提高此類應(yīng)用程序設(shè)計(jì)和運(yùn)行的效率。
關(guān)鍵詞:DataSet;TypedDataSet;ASP.NET;TableAdapter
中圖分類號(hào):TP3 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2012)33-7931-02
ADO.NET是一組面向.NET程序員公開數(shù)據(jù)訪問服務(wù)的類,為創(chuàng)建分布式數(shù)據(jù)共享應(yīng)用程序提供了一組豐富的組件。DataSet對(duì)象是支持ADO.NET的斷開式、分布式數(shù)據(jù)方案的核心成員之一,但是DataSet從數(shù)據(jù)庫中讀取數(shù)據(jù)時(shí),所得到的數(shù)據(jù)都是未經(jīng)實(shí)例化的對(duì)象,設(shè)計(jì)和運(yùn)行效率都比較低,而TypedDataSet提前定義了一些自己的列與表的泛型DataSet,這樣編譯器已經(jīng)知道它們將會(huì)包含什么內(nèi)容,從而簡(jiǎn)化了開發(fā)流程,生成可伸縮性的多層數(shù)據(jù)庫應(yīng)用程序。
1TypedDataSet的優(yōu)點(diǎn)
TypedDataSet根據(jù)事先定義好的DataSchema生成數(shù)據(jù)集,并對(duì)數(shù)據(jù)集中的字段實(shí)行強(qiáng)類型的約束,對(duì)DataTable的操作進(jìn)行了封裝。從數(shù)據(jù)庫中讀取數(shù)據(jù)填充到弱類型的DataSet時(shí),是將數(shù)據(jù)行和列作為集合中的項(xiàng)公開了,所以需要通過位置索引(運(yùn)行效率稍次)或字段名(運(yùn)行效率最低)來引用,如ds.Tables[“Persons”].Rows[0][“UserName”]=”aaa”,如果列名寫錯(cuò)了,寫成了UseName,在編譯時(shí)不會(huì)發(fā)現(xiàn)錯(cuò)誤,只有在程序運(yùn)行時(shí)才會(huì)提示:“列“UseName”不屬于表Persons”,因此,程序員在開發(fā)應(yīng)用程序時(shí)必須記住列名,設(shè)計(jì)和運(yùn)行效率都比較低。而TypedDataSet則是將數(shù)據(jù)集中的行和列作為對(duì)象的屬性公開,可以根據(jù)對(duì)象的強(qiáng)類型屬性名稱來訪問表和字段的值,adapter.GetData()[0].UserName=”aaa”,這樣不僅避免了字段寫錯(cuò)的情況,還大大提高了程序的運(yùn)行效率。
DataTable中的數(shù)據(jù)類型只是在運(yùn)行時(shí)進(jìn)行類型檢查,DataRow類的索引器顯示為Object數(shù)據(jù)類型,代碼在設(shè)計(jì)期間可以將任何數(shù)據(jù)類型的值賦值給該列,而編譯器并不知道究竟會(huì)不會(huì)成功。從DataSet中檢索的數(shù)據(jù)同樣也是Object數(shù)據(jù)類型,引用時(shí)必須進(jìn)行強(qiáng)制類型轉(zhuǎn)換,stringusername=Convert.ToString(ds.Tables[“Persons”].Rows[0][“UserName”])。而TypedDataSet提供了類型檢查,在設(shè)計(jì)時(shí)通過自定義字段名對(duì)字段進(jìn)行智能感知,強(qiáng)類型對(duì)象的強(qiáng)類型屬性都有明確的數(shù)據(jù)類型,在設(shè)計(jì)期間,編譯器就可以檢測(cè)出類型不兼容的問題,確保類型安全。
在為多張表創(chuàng)建TypedDataSet時(shí),即TypedDataSet中包含多數(shù)據(jù)集,這多張表如果在數(shù)據(jù)庫中已經(jīng)建好了關(guān)系和約束,或者在XSD中對(duì)這些數(shù)據(jù)集建立了關(guān)系和約束,那么TypeDataSet會(huì)生成相應(yīng)的方法來反映這些關(guān)系和約束。但是在UnTypedDataSet中,需要自己來做,而且TypedDataSet填充數(shù)據(jù)的速度較快。
2TypedDataSet的使用方法
TypedDataSet表現(xiàn)為一系列的類,包括派生于DataSet的TypedDataSet,派生于DataTable的TypedDataTable,派生于DataRow的TypedDataRow。創(chuàng)建TypedDataSet比較簡(jiǎn)單,使用VS提供的拖放工具就可以創(chuàng)建,先新建一個(gè)網(wǎng)站MyWebSite,然后在該站點(diǎn)上右擊→“添加新項(xiàng)”→“數(shù)據(jù)集”,輸入名字“DataSetLogin.xsd”,然后從服務(wù)器資源管理器中將要?jiǎng)?chuàng)建數(shù)據(jù)集的表T_Login拖放到設(shè)計(jì)界面就完成了TypedDataSet的創(chuàng)建,并將數(shù)據(jù)庫的連接字符串寫入了Web.Config文件中,同時(shí)還生成了SelectCommand、InsertCommand、UpdateCommand和DeleteCommand等屬性,可以通過T_LoginTableAdapter對(duì)象的GetData()、Insert()、Update()和Delete()等方法來執(zhí)行相應(yīng)的操作。但是TypedDataSet所提供的方法很少,遠(yuǎn)遠(yuǎn)不能滿足開發(fā)應(yīng)用程序的需要,所以可以在TypedDataSet中添加自定義的SQL語句,在設(shè)計(jì)器的TableAdapter中右擊→“添加查詢”,或是在DataTable上右擊→“添加”→“查詢”,可以通過SQL語句、新的或現(xiàn)有的存儲(chǔ)過程去訪問數(shù)據(jù)庫。使用SQL語句訪問數(shù)據(jù)庫可以通過select返回行或返回單個(gè)值、update、delete、insert等類型來訪問。
但是,在使用TypedDataSet開發(fā)應(yīng)用程序時(shí),如果需要添加自定義的SQL語句并選擇通過SQL語句返回行時(shí),需要注意生成TypedDataSet的那張表中最好所有的字段都選擇,也就是使用默認(rèn)選擇或select*,如果只選擇自己所關(guān)心的字段時(shí),必須把定義該表時(shí)設(shè)置為非空、添加了約束的字段都選上,否則就會(huì)出現(xiàn)“未能啟用約束。一行或多行中包含違反非空、唯一或外鍵約束的值”這樣的錯(cuò)誤。
3使用TypedDataSet進(jìn)行批量操作
使用TypedDataSet進(jìn)行批量操作時(shí),比較耗時(shí),因?yàn)樯傻膹?qiáng)類型的TableAdapter默認(rèn)的每次調(diào)用方法都需要打開連接,執(zhí)行代碼、關(guān)閉連接,在對(duì)類型化的TableAdapter的Insert等方法進(jìn)行跟蹤時(shí)發(fā)現(xiàn)previousConnectionState屬性,代碼顯示如果在操作之前連接狀態(tài)沒有打開才打開,操作之前連接狀態(tài)是關(guān)閉才關(guān)閉,所以,需要在操作之前將手動(dòng)的將連接打開,批量操作結(jié)束之后再關(guān)閉,這樣批量操作就在一個(gè)連接中進(jìn)行了,可以極大的提高執(zhí)行效率。
4結(jié)束語
TypedDataSet在開發(fā)應(yīng)用程序的過程中彌補(bǔ)了DataSet容易出現(xiàn)代碼復(fù)雜、易出錯(cuò)、調(diào)試?yán)щy、在編譯期間難以發(fā)現(xiàn)錯(cuò)誤、安全性比較低等弱點(diǎn),雖然在執(zhí)行時(shí)類型不能更改,但使用TypedDataSet對(duì)SQL語句進(jìn)行了封裝,快速的建立了數(shù)據(jù)訪問層,使開發(fā)者可以更加關(guān)注業(yè)務(wù)邏輯,提高開發(fā)和運(yùn)行效率。
參考文獻(xiàn):
[1]丁士鋒,朱毅,楊明羽.精通C#3.0與.NET3.5高級(jí)編程-LINQ.WCF.WPF.WF[M].北京:清華大學(xué)出版社,2009.
[2]艾維耶.ASP.NET4高級(jí)編程-涵蓋C#和VB.NET[M].北京:清華大學(xué)出版社,2010.