|
在學(xué)習(xí)DataTable知識(shí)之前,我們有必要了解下ADO.NET。以下摘自MSDN:
ADO.NET 對(duì) Microsoft SQL Server 和 XML 等數(shù)據(jù)源以及通過(guò) OLE DB 和 XML 公開(kāi)的數(shù)據(jù)源提供一致的訪問(wèn)。數(shù)據(jù)共享使用者應(yīng)用程序可以使用 ADO.NET 來(lái)連接到這些數(shù)據(jù)源,并檢索、處理和更新所包含的數(shù)據(jù)。 ADO.NET中包含的對(duì)象及其關(guān)系如下圖:
1、DataTable簡(jiǎn)介
1.1 DataTable的定義
表示內(nèi)存中數(shù)據(jù)的一個(gè)表。 我們知道數(shù)據(jù)庫(kù)中存儲(chǔ)的是實(shí)體表,實(shí)體表中有一系列的數(shù)據(jù)。而DataTable即存儲(chǔ)在內(nèi)存中的表,在持久化到數(shù)據(jù)庫(kù)之前,是不會(huì)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生影響的,持久化到數(shù)據(jù)庫(kù)可以使用dataAdapter.Update的方法(dataAdapter是某個(gè)實(shí)例化的DataAdapter對(duì)象)。 注意:當(dāng)訪問(wèn) DataTable 對(duì)象時(shí),請(qǐng)注意它們是按條件區(qū)分大小寫的。例如,如果一個(gè) DataTable 被命名為“mydatatable”,另一個(gè)被命名為“Mydatatable”,則用于搜索其中一個(gè)表的字符串被認(rèn)為是區(qū)分大小寫的。但是,如果“mydatatable”存在而“Mydatatable”不存在,則認(rèn)為該搜索字符串不區(qū)分大小寫。
得到DataTable有許多方法,下面簡(jiǎn)單羅列出來(lái): 1.2.1通過(guò)構(gòu)造函數(shù)得到DataTable 1.2.2通過(guò)DataSet獲取DataTable DataTable dt=ds.Tables["TableName"];//TableName是表名 1.2.3 通過(guò)DataRow自定義DataTable的結(jié)構(gòu) DataTable dt= new DataTable("TB_USER");
DataColumn colUserID = new DataColumn("USER_ID", Type.GetType("System.Int"));
dt.Columns.Add(colCurrency);
DataColumn colUserName= new DataColumn("USER_NAME", Type.GetType("System.String"));
dt.Columns.Add(colUserName);
這樣得到是一個(gè)表的結(jié)構(gòu),里面沒(méi)有任何數(shù)據(jù),表面為TB_USER。
1.2.4通過(guò)已有的DataTable得到新的DataTable
可以使用DataTable.Clone()方法獲得現(xiàn)有DataTable的表的結(jié)構(gòu),這在實(shí)際中也是常用的
1.2.5通過(guò)DataAdapter填充DataTable
DataAdapter.Fill(dt);來(lái)填充DataTable,這也是新手常用的方法,通常是些sql語(yǔ)句,然后使用command,是最基礎(chǔ)的方法。
1.2.6通過(guò)DataRow數(shù)組導(dǎo)入DataTable
DataRow [] drs;//drs是某個(gè)有數(shù)據(jù)的DataRow數(shù)組
foreach(DataRow dr in drs) { dt.ImportRow(dr); }
1.3 DataTable常用屬性 CaseSensitive 指示表中的字符串比較是否區(qū)分大小寫。 ChildRelations 獲取此DataTable 的子關(guān)系的集合。 Columns 獲取屬于該表的列的集合。 Constraints 獲取由該表維護(hù)的約束的集合。 DefaultView 獲取可能包括篩選視圖或游標(biāo)位置的表的自定義視圖。 HasErrors 獲取一個(gè)值,該值指示該表所屬的 DataSet 的任何表的任何行中是否有錯(cuò)誤。 MinimumCapacity 獲取或設(shè)置該表最初的起始大小。該表中行的最初起始大小。默認(rèn)值為 50。 Rows 獲取屬于該表的行的集合。 TableName 獲取或設(shè)置DataTable 的名稱。
1.4 DataTable是ADO.NET中的重要成員
DataSet中可包括多個(gè) DataTable,可將多個(gè)查詢結(jié)構(gòu)存到一個(gè)DataSet中,方便操作,而DataTable中又包括多個(gè)DataRow、DataColumn,可通過(guò)這些DataRow、DataColumn來(lái)查看、操作其中的數(shù)據(jù),而需將操作結(jié)果返回給數(shù)據(jù)庫(kù)的話,則可以調(diào)用DataAdapter的 Update方法。
2、DataTable成員之DataRow
DataTable是由一個(gè)個(gè)DataRow組合而成,DataTable.Rows[i]即表示其中的第i行。 DataRow有一個(gè)十分重要的狀態(tài)(RowState),這個(gè)狀態(tài)經(jīng)常被我們忽略,從而導(dǎo)致一些莫名其妙的bug。RowState 的值是一個(gè)枚舉類型的,RowState 有 Added, Modified, Unchanged, Deleted, Detached 幾種, 分別表示 DataRow 被添加, 修改, 無(wú)變化, 刪除, 從表中脫離. 在調(diào)用一些方法或者進(jìn)行某些操作之后, 這些狀態(tài)可以相互轉(zhuǎn)化。我們不做什么判斷就開(kāi)始操作DataRow,這就有可能導(dǎo)致某些狀態(tài)為Deleted的行也同時(shí)被操作,這樣就有可能導(dǎo)致臟數(shù)據(jù)的產(chǎn)生。
3、DataTable成員之DataColumn
DataColumn 表示 DataTable 中列的架構(gòu)。
3.1 DataColumn中常見(jiàn)的熟悉及其說(shuō)明如下:
3.2 DataColumn.Expression 表達(dá)式 表達(dá)式語(yǔ)法
在創(chuàng)建表達(dá)式時(shí),使用 ColumnName 屬性來(lái)引用列。例如,如果一個(gè)列的 ColumnName 是“UnitPrice”,而另一個(gè)是“Quantity”,則表達(dá)式將是: "UnitPrice * Quantity"
4、DataTable成員之DataView
DataView類似數(shù)據(jù)庫(kù)中的視圖。 DataView 使您能夠創(chuàng)建 DataTable 中所存儲(chǔ)的數(shù)據(jù)的不同視圖,這種功能通常用于數(shù)據(jù)綁定應(yīng)用程序。使用 DataView,您可以使用不同排序順序顯示表中的數(shù)據(jù),并且可以按行狀態(tài)或基于篩選器表達(dá)式來(lái)篩選數(shù)據(jù)。 DataView 提供基礎(chǔ) DataTable 中的數(shù)據(jù)的動(dòng)態(tài)視圖:內(nèi)容、排序和成員關(guān)系會(huì)實(shí)時(shí)反映其更改。此行為不同于 DataTable 的 Select 方法,后者從表中按特定的篩選器和/或排序順序返回 DataRow 數(shù)組,雖然其內(nèi)容反映對(duì)基礎(chǔ)表的更改,但其成員關(guān)系和排序卻則保持靜態(tài)。DataView 的動(dòng)態(tài)功能使其成為數(shù)據(jù)綁定應(yīng)用程序的理想選擇。 在實(shí)際運(yùn)用中,我們時(shí)常使用如下代碼: DataView dv = dt.DefaultView; DataTable dtNew=dv.ToTable();//將DataView重新轉(zhuǎn)為DataTable 4.1 DataViewRowState: 其實(shí)DataView是類似于DataTable,它里面也有RowState,我們可以使用RowStateFilter來(lái)過(guò)濾不同狀態(tài)的行。
4.2 DataView的過(guò)濾器
設(shè)置過(guò)濾 RowFilter是一個(gè)可讀寫的屬性,用來(lái)讀取和設(shè)置表過(guò)濾的表達(dá)式。public virtual string RowFilter {get; set;} 你可以用列名,邏輯和數(shù)字運(yùn)算符和常量的任意合法組合組成表達(dá)式。以下是一些例子:
4.3 DataView 的排序
DataView支持Sort屬性,可以用來(lái)對(duì)視圖中的內(nèi)容排序。Sort由用逗號(hào)分隔的列名表達(dá)式進(jìn)行排序。通過(guò)在任何列名后加ASC或者DESC限定詞,可以使得字段按照上升或者下降的順序排列。如果沒(méi)有方向限定詞,默認(rèn)順序?yàn)锳SC。
實(shí)例篇 實(shí)例1.DataTable分組統(tǒng)計(jì)數(shù)據(jù)
如上表是dt中的數(shù)據(jù),如果要分組進(jìn)行統(tǒng)計(jì)各學(xué)生的平均科目成績(jī), 可以使用如下的方法(當(dāng)然如果你的.Net版本支持Linq的話,可以使用Linq) 思路:找出所有的學(xué)生,遍歷表,計(jì)算該學(xué)生的平均成績(jī),參考代碼如下: //獲取所有的學(xué)生
DataView myDataView = new DataView(dt);
string[] strComuns ={ "Name"};
DataTable dtTemp = myDataView.ToTable(true, strComuns);
//新建DataTable存儲(chǔ)結(jié)構(gòu),結(jié)構(gòu)同dt
DataTable dtNew=dt.Clone();
//根據(jù)學(xué)生統(tǒng)計(jì)數(shù)據(jù)
for (int i = 0; i < dtTemp.Rows.Count; i++)
{
DataRow drDetail = dtNew.NewRow();
drDetail["Name"] = dtTemp.Rows[i]["Name"].ToString();
drDetail["Scores"] = dt.Compute("AVer(Scores)", "Name='" + dtTemp.Rows[i]["Name"].ToString() + "'");
dtNew.Rows.Add(drDetail);
} |
|
|
來(lái)自: 悟靜 > 《.net和asp.net》