日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

DataTable的操作大全

 悟靜 2014-04-22

DataTable表示一個(gè)與內(nèi)存有關(guān)的數(shù)據(jù)表,可以使用工具欄里面的控件拖放來創(chuàng)建和使用,也可以在編寫程序過程中根據(jù)需要獨(dú)立創(chuàng)建和使用,最常見的情況是作為DataSet的成員使用,在這種情況下就需要用在編程過程中根據(jù)需要?jiǎng)討B(tài)創(chuàng)建數(shù)據(jù)表。那么在8.4節(jié)中主要講用編碼的方式來建立DataTable數(shù)據(jù)表以及對(duì)它的操作。

1 代碼創(chuàng)建DataTable數(shù)據(jù)表

如上8.3節(jié)里面所講,通過添加對(duì)象的方式直接在DataSet中創(chuàng)建數(shù)據(jù)表,可以通過使用Add方法將DataTable添加到DataSet中,這種是使用控件的可視化添加DataTable的操作,那么在代碼中怎么來創(chuàng)建DataTable數(shù)據(jù)表呢?

在程序中創(chuàng)建DataTable對(duì)象可以使用相應(yīng)的DataTable構(gòu)造函數(shù)。創(chuàng)建一個(gè)表名為TableName的數(shù)據(jù)表,實(shí)現(xiàn)代碼如下所示:

DataTable NewTable = new DataTable(TableName);

另外也可以通過以下方法創(chuàng)建DataTable對(duì)象:使用DataAdapter對(duì)象的Fill方法或FillSchema方法在DataSet中創(chuàng)建,這種方式都用于與數(shù)據(jù)庫相連接操作的情況下。實(shí)現(xiàn)代碼如下所示:

//數(shù)據(jù)庫聯(lián)接字符串

string connectionString =

"Data Source=local;Initial Catalog=Northwind;Integrated Security=True;UserID=sa;Password=";

//sql語句查詢

string commandString = "Select * from Customers";

// 創(chuàng)建SqlDataAdapter對(duì)象,并執(zhí)行sql命令

SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);

//創(chuàng)建數(shù)據(jù)集dataSet

DataSet dataSet = new DataSet();

//把數(shù)據(jù)表添加到數(shù)據(jù)集中

DataTable dataTable = dataSet.Tables("Customers");

//將數(shù)據(jù)填充到數(shù)據(jù)集中

dataAdapter.Fill(dataSet,"Customers");

注意:將一個(gè)DataTable作為成員添加到一個(gè)DataSet的Tables集合中后,不能再將其添加到任何其他DataSet的表集合中。

使用DataTable構(gòu)造函數(shù)初次創(chuàng)建DataTable時(shí),是沒有架構(gòu)(即結(jié)構(gòu),沒有列)的。沒有架構(gòu)的DataTable數(shù)據(jù)表示沒有辦法使用的,因此要在使用這種DataTable數(shù)據(jù)表之前要定義表的架構(gòu),必須創(chuàng)建DataColumn對(duì)象并將其添加到表的Columns集合中。如何使用代碼創(chuàng)建Columns列,將在本章后面幾節(jié)中講到。

創(chuàng)建DataTable時(shí),不需要為TableName屬性提供值,可以在其他時(shí)間指定該屬性,或者將其保留為空,這些都不影響DataTable的使用。應(yīng)該注意的是在將一個(gè)沒有TableName值的表添加到DataSet中時(shí),該表會(huì)得到一個(gè)從“Table”(表示Table0)開始遞增的默認(rèn)名稱TableN。

以下示例創(chuàng)建DataTable對(duì)象的實(shí)例,并為其指定名稱“Customers”。 實(shí)現(xiàn)代碼如下所示:

DataTable workTable = new DataTable("Customers");

以下代碼是將創(chuàng)建的DataTable實(shí)例Customers表添加到DataSet的Tables集合中。實(shí)現(xiàn)代碼如下所示:

DataSet customers = new DataSet();

DataTable customersTable = customers.Tables.Add("CustomersTable");

或者

DataSet customers = new DataSet();

DataTable customersTable = new DataTable(“Customers”)

customers.Tables.Add(Customers);

2 用編程方式添加DataTable列

前面已經(jīng)學(xué)過使用代碼創(chuàng)建DataTable,但是使用DataTable構(gòu)造函數(shù)初次創(chuàng)建 DataTable時(shí),是沒有架構(gòu)(即結(jié)構(gòu),沒有列)的。要定義表的架構(gòu),必須創(chuàng)建DataColumn 對(duì)象并將其添加到表的Columns集合中。也可以為表定義主鍵列,并且可以創(chuàng)建Constraint約束對(duì)象并將其添加到表的Constraints約束集合中。

DataColumn類型表示了DataTable上的一列。總的來說,綁定到某個(gè)DataTable的所有DataColumn類型的集合就表示一個(gè)表。

DataTable包含了由表的Columns屬性引用的DataColumn對(duì)象的集合。這個(gè)列的集合與任何約束一起定義表的架構(gòu)(即結(jié)構(gòu))。

通過使用DataColumn構(gòu)造函數(shù),或者通過調(diào)用表的Columns屬性的Add方法,可在表內(nèi)創(chuàng)建DataColumn對(duì)象。Add方法將接受可選的ColumnName、DataType參數(shù),并將創(chuàng)建新的DataColumn作為集合的成員。它還會(huì)接受現(xiàn)有的DataColumn對(duì)象并會(huì)將其添加到集合中,并會(huì)根據(jù)請(qǐng)求返回對(duì)所添加的DataColumn的引用。

以下示例向DataTable中添加了四列。實(shí)現(xiàn)代碼如下所示:

DataTable workTable = new DataTable("Customers");

DataColumn workCol = workTable.Columns.Add("CustID");

workTable.Columns.Add("CustLName");

workTable.Columns.Add("CustFName");

workTable.Columns.Add("Purchases");

代碼說明:

q CustID,CustLName,CustFName,Purchases:數(shù)據(jù)表Customers中的列名。

3 設(shè)置DataTable數(shù)據(jù)表的主鍵

數(shù)據(jù)庫開發(fā)的一個(gè)通常規(guī)則就是表至少得有一個(gè)列作為主鍵。主鍵約束用于惟一標(biāo)識(shí)給定表中的一條記錄(行)。假設(shè)現(xiàn)在需要新建一個(gè)DataColumn列來表示EmpID字段并且要將這個(gè)列將作為表的主鍵,它必須有AllowDBNull和Unique屬性,實(shí)現(xiàn)代碼如下所示:

DataTable workTable = new DataTable("Customers");

DataColumn workCol = workTable.Columns.Add("CustID", typeof(Int32));

workCol.AllowDBNull = false;

workCol.Unique = true;

workTable.Columns.Add("CustLName", typeof(String));

workTable.Columns.Add("CustFName", typeof(String)));

workTable.Columns.Add("Purchases", typeof(String)));

代碼說明:

示例中用于CustID列的屬性設(shè)置為不允許DBNull值并將值約束為唯一。但是,如果將CustID列定義為表的主鍵列,AllowDBNull屬性就會(huì)自動(dòng)設(shè)置為false,并且Unique屬性會(huì)自動(dòng)設(shè)置為true。

4 設(shè)置列的數(shù)據(jù)類型

通過上面8.4.2節(jié)的學(xué)習(xí)已經(jīng)知道怎么向新建的數(shù)據(jù)表中添加列了,那么下面來看一看,怎么為添加的列設(shè)置列的數(shù)據(jù)類型。數(shù)據(jù)類型是標(biāo)明一列數(shù)據(jù)的數(shù)據(jù)類型屬性,根據(jù)不同的需要可以在DataTable數(shù)據(jù)表中建立不同的列,并可以為不同的列設(shè)置不同的數(shù)據(jù)類型,來滿足需要。繼續(xù)上面Customers表的例子,為創(chuàng)建的列添加數(shù)據(jù)類型:

實(shí)現(xiàn)代碼如下所示:

//創(chuàng)建一個(gè)數(shù)據(jù)表Customers

DataTable CustomersTable = new DataTable("Customers");

//創(chuàng)建一個(gè)Int32類型名稱是CustID列,把這個(gè)列設(shè)置成主鍵,并且不允許為空,

DataColumn CustomersCol = CustomersTable.Columns.Add("CustID", typeof(Int32));

CustomersCol.AllowDBNull = false;

CustomersCol.Unique = true;

//創(chuàng)建三個(gè)String類型的列CustLName,CustFName,Purchases

CustomersTable.Columns.Add("CustLName", typeof(String));

CustomersTable.Columns.Add("CustFName", typeof(String)));

CustomersTable.Columns.Add("Purchases", typeof(String)));

代碼說明:

示例中用于CustID列定義為表的主鍵列。CustID列指定的數(shù)據(jù)類型是Int32,CustLName列、CustFName列、Purchases列指定的數(shù)據(jù)類型都是String的列,當(dāng)然也可以不設(shè)置列的數(shù)據(jù)類型,在這個(gè)時(shí)候DataColumn的DataType屬性默認(rèn)為字符串類型,當(dāng)然可以根據(jù)需要在創(chuàng)建列名時(shí)進(jìn)行列數(shù)據(jù)類型的設(shè)置。

5 啟用Autoincrementing字段

在8.4.4節(jié)中學(xué)會(huì)了如何設(shè)置DataColumn列的數(shù)據(jù)類型,在設(shè)置完DataColumn列的數(shù)據(jù)類型以后,也可以像SQL-Server數(shù)據(jù)庫表一樣把某一列設(shè)置成自動(dòng)遞增的。簡(jiǎn)單地說,自動(dòng)增加列可以確保當(dāng)一個(gè)新行被添加到給定表時(shí),可以基于當(dāng)前的遞增步長(zhǎng)值自動(dòng)指定這個(gè)列的值。特別是某一列作為沒有重復(fù)值得主鍵的時(shí)候,這個(gè)功能就特別有用。在DataTable中這個(gè)功能可以用AutoIncrement(列是否將列的值自動(dòng)遞增)、AutoIncrementSeed(起始值,種子值)和AutoIncrementStep(步長(zhǎng))屬性來控制。

下面是創(chuàng)建一個(gè)支持自動(dòng)遞增的DataColumn列的例子。種子值用于標(biāo)記列的起始值,步長(zhǎng)值表示遞增時(shí)增加種子值的數(shù)值,代碼如下所示:

// 創(chuàng)建一個(gè)新列

DataColumn myColumn = new DataColumn();

myColumn.ColumnName = " CustID ";

myColumn.DataType = System.Type.GetType("System.Int32");

// 設(shè)置自動(dòng)遞增

myColumn.AutoIncrement = true;

myColumn.AutoIncrementSeed = 0;

myColumn.AutoIncrementStep = 1;

代碼說明:

q AutoIncrement:列是否將列的值自動(dòng)遞增,true表示自動(dòng)遞增,false表示不能自動(dòng)遞增。

q AutoIncrementSeed:起始值種子值,AutoIncrement屬性設(shè)置為true的列的起始值。

q AutoIncrementStep:步長(zhǎng),遞增量,AutoIncrement屬性設(shè)置為true的列的步長(zhǎng)。

創(chuàng)建一個(gè)數(shù)據(jù)類型為Int32的CustID列,為了能使這個(gè)字段的值實(shí)現(xiàn)自動(dòng)增加的效果,把列AutoIncrement屬性設(shè)置為true;把列得種子值A(chǔ)utoIncrementSeed定為0,也就是從0開始計(jì)數(shù);同時(shí)設(shè)置自動(dòng)增加的步長(zhǎng)AutoIncrementStep為1,每次增加一個(gè)。由于種子值被定為0,前面5個(gè)值應(yīng)該是0、1、2、3和4。

可以往一個(gè)DataTable中添加這個(gè)DataColumn來測(cè)試一下。然后往這個(gè)表中添加一些新行,當(dāng)然會(huì)自動(dòng)轉(zhuǎn)儲(chǔ)CustID列中的值,代碼如下所示:

//實(shí)現(xiàn)列自動(dòng)增加功能

protected void Button1_Click(object sender, EventArgs e)

{

//創(chuàng)建一個(gè)新的數(shù)據(jù)列,名稱:CustID ,數(shù)據(jù)類型:Int32.

DataColumn myColumn = new DataColumn();

myColumn.ColumnName = " CustID ";

myColumn.DataType = System.Type.GetType("System.Int32");

//把新創(chuàng)建的列設(shè)置自動(dòng)增加,種子為0,增加步長(zhǎng)為1.

myColumn.AutoIncrement = true;

myColumn.AutoIncrementSeed = 0;

myColumn.AutoIncrementStep = 1;

//把這個(gè)列添加到Customers表中.

DataTable CustomersTable = new DataTable("Customers");

myTable. CustomersTable.Add(myColumn);

//添加20個(gè)新行.

DataRow r;

for (int i = 0; i < 20; i++)

{

r = CustomersTable.NewRow();

CustomersTable.Rows.Add(r);

}

//顯示每一行的數(shù)據(jù)值.

string temp = "";

DataRowCollection rows = CustomersTable.Rows;

for (int i = 0; i < CustomersTable.Rows.Count; i++)

{

DataRow currRow = rows[i];

temp += currRow["CustID "] + " ";

}

//在Label1面顯示所有值

Label1.Text = Label1.Text+temp;

}

如果把上面代碼寫在建立的Web程序中,運(yùn)行后點(diǎn)擊“Button”按鈕,就會(huì)得出初始值為0的步長(zhǎng)為1的一系列數(shù),結(jié)果如圖:8.4.1所示的顯示結(jié)果。

6 用編程方式添加DataTable行

在為DataTable定義了架構(gòu)之后,也就是設(shè)置好了需要的列名以后,就可以可通過將DataRow對(duì)象添加到表的Rows集合中來將數(shù)據(jù)行添加到表中。與添加DataColumn類似,同樣可以通過使用DataRow構(gòu)造函數(shù),或者通過調(diào)用表的Rows屬性的Add方法,可在表內(nèi)創(chuàng)建DataRow對(duì)象。

DataColumn對(duì)象集合表示了表的模式(Schema)。DataTable通過內(nèi)部的DataColumnCollection類型保存表中所有列。相反,DataRow類型集合就表示表中的實(shí)際數(shù)據(jù)。這樣,如果Customers表中有10個(gè)記錄,就可以使用10個(gè)DataRow類型來表示它們。使用DataRow類的成員可以對(duì)表中的值進(jìn)行插入、刪除、求值和操作操作。

創(chuàng)建一個(gè)DataRow數(shù)據(jù)行的對(duì)象,實(shí)現(xiàn)代碼如下所示:

//創(chuàng)建一個(gè)Customers數(shù)據(jù)表

DataTable CustomersTable = new DataTable("Customers ");

//創(chuàng)建一個(gè)新的數(shù)據(jù)行

DataRow arow = CustomersTable.NewRow();

//設(shè)置行的值

arow[ColumnName] = DataValue;

//把數(shù)據(jù)行添加創(chuàng)建的Customers數(shù)據(jù)表中

CustomersTable.Rows.Add(arow);

功能說明:

新建一行arow, 并給這行某一個(gè)列名付值為DataValue,最后把這一行添加到Customers表中。使用DataRow與使用DataColumn有些不同,因?yàn)椴豢梢灾苯觿?chuàng)建這個(gè)類型的實(shí)例,而是獲得一個(gè)來自給定DataTable的引用。例如,假設(shè)想往Customers表中添加新行,DataTable.NewRow()方法可以獲得下一空位,然后在上面填充每列的數(shù)據(jù)。

實(shí)現(xiàn)代碼如下所示:

//創(chuàng)建一個(gè)數(shù)據(jù)表

DataTable CustomersTable = new DataTable("Customers");

//聲明數(shù)據(jù)表的行和列變量

DataColumn column;

DataRow row;

//創(chuàng)建一個(gè)新列,設(shè)置列的數(shù)據(jù)列性和列名,并把這個(gè)新列添加到Customers表中

column=new DataColumn();

column.DataType = System.Type.GetType("System.Int32");

column.ColumnName = " CustID ";

CustomersTable.Columns.Add(column);

//再創(chuàng)建一個(gè)新列

column = new DataColumn();

column.DataType = Type.GetType("System.String");

column.ColumnName = " CustLName ";

CustomersTable.Columns.Add(column);

//創(chuàng)建新的一行并把這個(gè)行添加到Customers表中

for(int i = 0; i < 10; i++)

{

row = CustomersTable.NewRow();

row["CustID "] = i;

row["CustLName "] = "item " + i.ToString();

CustomersTable.Rows.Add(row);

}

功能說明:

向CustomersTable表創(chuàng)建兩個(gè)列分別是CustID, CustLName,然后用循環(huán)的方式產(chǎn)生10行并附值,添加到CustomersTable表中。

7 操作DataTable:更新行

在前面一節(jié)里面講了,怎么樣添加一個(gè)DataRow行,那么下面需要了解的關(guān)于DataTable的另一個(gè)方面就是怎樣用新值更新已有的DataRow行。下面開始介紹關(guān)于DataTable更新行的問題。

最常使用的一個(gè)方法就是先用Select()方法獲得符合給定過濾條件的行。一旦獲得這些DataRow,就對(duì)它們作相應(yīng)的修改。例如,假定有一個(gè)新按鈕在被單擊后,搜索DataTable中所有EmployeeID列值為5的行。一旦標(biāo)識(shí)這些項(xiàng)后,就可以把EmployeeID列對(duì)應(yīng)值5改為6。實(shí)例代碼如下:

//數(shù)據(jù)庫聯(lián)接字符串

string connectionString =

"Data Source=local;Initial Catalog=Northwind;Integrated Security=True;UserID=sa;Password=";

//sql語句把Orders表中的數(shù)據(jù)信息都取出來

string commandString = "Select * from Orders";

SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);

DataSet dataSet = new DataSet( );

//填充數(shù)據(jù)集

dataAdapter.Fill(dataSet," Orders");

//填充數(shù)據(jù)表

DataTable dataTable = dataSet.Tables("Orders");

// 建立一個(gè)用于過濾出EmployeeID列值為5的行的行的變量

string filterStr = "EmployeeID=5";

string strEmployeeID = null;

// 查詢出來所有EmployeeID列值為5的行.

DataRow[] EmployeeID= dataTable.Select(filterStr);

// EmployeeID列對(duì)應(yīng)值5改為6

for(int i = 0; i < EmployeeID.Length; i++)

{

DataRow temp = EmployeeID [i];

strEmployeeID += temp["EmployeeID "] = 6;

EmployeeID [i] = temp;

}

8 用編程方式刪除DataTable行

用于從DataTable對(duì)象中刪除DataRow對(duì)象的方法有兩種:DataRowCollection對(duì)象的 Remove方法和DataRow對(duì)象的Delete方法。

Remove方法和Delete方法都可以將DataTable的行DataRow刪除,但是前者是從DataRowCollection中刪除DataRow,而后者只將行標(biāo)記為刪除。當(dāng)應(yīng)用程序調(diào)用AcceptChanges方法時(shí),才會(huì)發(fā)生實(shí)際的刪除。通過使用Delete,可以在實(shí)際刪除之前先以編程方式檢查哪些行標(biāo)記為刪除。如果將行標(biāo)記為刪除,其RowState屬性會(huì)設(shè)置為Deleted。

在將DataSet或DataTable與DataAdapter和關(guān)系型數(shù)據(jù)源一起使用時(shí),用DataRow的 Delete方法移除行。Delete方法只是在DataSet或DataTable中將行標(biāo)記為Deleted,而不會(huì)移除它。而DataAdapter在遇到標(biāo)記為Deleted的行時(shí),會(huì)執(zhí)行其DeleteCommand方法以在數(shù)據(jù)源中刪除該行。然后,就可以用AcceptChanges方法永久移除該行。如果使用Remove 刪除該行,則該行將從表中完全移除,但DataAdapter不會(huì)在數(shù)據(jù)源中刪除該行。

DataRowCollection的Remove方法采用DataRow作為參數(shù),并將其從集合中移除,實(shí)現(xiàn)代碼如下所示:

DataTable CustomersTable = new DataTable("Customers ");

DataRow workRow = empTable.NewRow();

CustomersTable.Rows.Remove(workRow);

作為對(duì)比,以下示例演示了如何調(diào)用DataRow上的Delete方法來將其RowState改為Deleted。實(shí)現(xiàn)代碼如下所示:

DataTable CustomersTable = new DataTable("Customers ");

DataRow workRow = empTable.NewRow();

workRow.Delete();

如果將行標(biāo)記為刪除,并且調(diào)用DataTable對(duì)象的AcceptChanges方法,該行就會(huì)從DataTable中移除。相比之下,如果調(diào)用RejectChanges,行的RowState就會(huì)恢復(fù)到被標(biāo)記為Deleted之前的狀態(tài)。

9 向DataTable填充數(shù)據(jù)

ADO.NET中的DataSet是數(shù)據(jù)的內(nèi)存駐留表示形式,它提供了獨(dú)立于數(shù)據(jù)源的一致關(guān)系編程模型。DataSet表示整個(gè)數(shù)據(jù)集,其中包含表、約束和表之間的關(guān)系。由于DataSet獨(dú)立于數(shù)據(jù)源,DataSet可以包含應(yīng)用程序本地的數(shù)據(jù),也可以包含來自多個(gè)數(shù)據(jù)源的數(shù)據(jù)。與現(xiàn)有數(shù)據(jù)源的交互通過DataAdapter來控制。

DataAdapter的SelectCommand屬性是一個(gè)Command對(duì)象,用于從數(shù)據(jù)源中檢索數(shù)據(jù)。DataAdapter的InsertCommand、UpdateCommand和DeleteCommand屬性也是Command對(duì)象,用于按照對(duì)DataSet中數(shù)據(jù)的修改來管理對(duì)數(shù)據(jù)源中數(shù)據(jù)的更新。

DataAdapter的Fill方法用于使用DataAdapter的SelectCommand的結(jié)果來填充DataSet。Fill將要填充的DataSet和DataTable對(duì)象(或要使用從SelectCommand中返回的行來填充的DataTable的名稱)作為它的參數(shù)。

Fill方法使用DataReader對(duì)象來隱式地返回用于在DataSet中創(chuàng)建表的列名稱和類型以及用于填充DataSet中的表行的數(shù)據(jù)。表和列僅在不存在時(shí)才創(chuàng)建;否則,F(xiàn)ill將使用現(xiàn)有的DataSet架構(gòu)。

以下代碼示例使用SqlDataAdapter對(duì)象獲取Microsoft SQL Server Northwind數(shù)據(jù)庫的數(shù)據(jù)填充到Customers數(shù)據(jù)集中的Customers表。

實(shí)現(xiàn)代碼如下所示:

//使用DataAdapter的Fill方法向Customers表中填充數(shù)據(jù)

string connectionString =

"Data Source= local;Initial Catalog=Northwind;Integrated Security=True; UserID=sa;Password=";

string commandString = "Select * from Customers";

SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);

DataSet customers = new DataSet();

dataAdapter.Fill(customers, "Customers");

10 在DataTable實(shí)現(xiàn)類似sql語句的查詢功能

在脫離數(shù)據(jù)庫的DataSet實(shí)現(xiàn)類似sql語句的查詢。

也就是(select ... from tablename where ...)這樣的功能。

將從DataSet中查詢出來的數(shù)據(jù)以行的形式保存到arow中。

實(shí)現(xiàn)代碼如下所示:

DataSet ds= new DataSet();

DataRow[] arow = ds.Tables[TableName].Select("" + ColumnsName+ "=''" + DataValue + "''");

代碼說明:

qTableName:數(shù)據(jù)集ds中的表名。

qColumnsName:TableName表中的某一列名。

qDataValue:和列名對(duì)應(yīng)參數(shù)的值。

功能說明:

上面語句功能相當(dāng)于sql語句中的查詢語句

Select * From TableName where ColumnsName= DataValue

11 DataTable中數(shù)據(jù)記錄的統(tǒng)計(jì)

在使用數(shù)據(jù)庫時(shí)例如SQL-Server、Oracle這些數(shù)據(jù)庫,可以輕松的通過統(tǒng)計(jì)和計(jì)算函數(shù)例如Sum、Aver、Count等統(tǒng)計(jì)或計(jì)算出相關(guān)結(jié)果,那么,在已經(jīng)把數(shù)據(jù)檢索出來的DataTable數(shù)據(jù)集中能否同樣使用呢?在程序中根據(jù)需要?jiǎng)討B(tài)創(chuàng)建的DataTable是沒有辦法使用sql語句進(jìn)行查詢統(tǒng)計(jì)的,例如沒有辦法使用Select語句來獲取查詢統(tǒng)計(jì)結(jié)果。那么在DataTable中怎么來進(jìn)行統(tǒng)計(jì)呢?

本節(jié)將介紹一個(gè)簡(jiǎn)單的方法,可以輕松的獲得DataTable中的記錄統(tǒng)計(jì)結(jié)果。這個(gè)簡(jiǎn)單的方法就是調(diào)用功能強(qiáng)大的DataTable的函數(shù)Compute。

函數(shù)如下:

public object Compute(string expression,string filter)

參數(shù)說明:

qexpression 參數(shù)需要聚合函數(shù),要計(jì)算的表達(dá)式字符串,基本上類似于Sql Server中的統(tǒng)計(jì)表達(dá)式。例如,以下是合法表達(dá)式:Count(ID)。

qfilter:統(tǒng)計(jì)的過濾字符串,只有滿足這個(gè)過濾條件的記錄才會(huì)被統(tǒng)計(jì),也就是確定在表達(dá)式中使用哪些行。

以下示例,以SQL-Server數(shù)據(jù)庫中的Northwind數(shù)據(jù)庫中的Orders數(shù)據(jù)表,描述訂單信息,包含字段為:訂單號(hào)(OrderID)、客戶編號(hào)(CustomerID)、職工編號(hào)(EmployeeID)、訂貨時(shí)間(OrderDate)、船號(hào)(ShipVia)、運(yùn)費(fèi)(Freight)。

1.統(tǒng)計(jì)所有職工編號(hào)EmployeeID為5的數(shù)量:

table.Compute("Count(*)","EmployeeID=5");

2.統(tǒng)計(jì)所有運(yùn)費(fèi)Freight中運(yùn)費(fèi)大于100的個(gè)數(shù)

table.Compute("Count(*)","Freight>100''");

3.統(tǒng)計(jì)運(yùn)費(fèi)Freight的平均值

table.Compute("Aver(Freight)","true");

4.統(tǒng)計(jì)職工編號(hào)EmployeeID為5的運(yùn)費(fèi)總額:

table.Compute("Sum(Freight)"," EmployeeID=5");

以上都是計(jì)算每一列的合計(jì),那么要添加一行求合計(jì)可以使用下面的方法:

//創(chuàng)建一個(gè)數(shù)據(jù)集

DataSet customers = new DataSet();

//在數(shù)據(jù)集中添加一個(gè)名稱為CustomersTable的數(shù)據(jù)表

DataTable customersTable = customers.Tables.Add("CustomersTable");

//創(chuàng)建一個(gè)新行并添加到CustomersTable數(shù)據(jù)表中

DataRow dataRow = new DataRow();

dataRow= customersTable.NewRow();

//然后就是統(tǒng)計(jì)了,聲明連個(gè)int 變量i:循環(huán)變量, colCnt: customersTable表中的列數(shù)

int i ;

int colCnt ;

colCnt = customersTable.Cols.Count;

for( i=0 ;i< colCnt -1;i++)

//求第i列的和并且結(jié)果賦值給新的dataRow數(shù)據(jù)行

dataRow(i)= customersTable.Compute("Sum("+i.ToString()+")","true");

//把數(shù)據(jù)行添加到customersTable數(shù)據(jù)表中

customersTable.Rows.Add(dataRow);

12 DataTable和xml的一些應(yīng)用總結(jié)

在ASP.NET2.0中ADO.NET和XML結(jié)合的很緊密,第7章中已經(jīng)詳細(xì)介紹了在ADO.NET中的數(shù)據(jù)通過DataSet很容易存取在XML中的,那么在DataTable能像在DataSet中那樣操作XML數(shù)據(jù)文件嗎?答案是可以的,下面就是一個(gè)將DataTable中的數(shù)據(jù)寫入到XML文件中去的操作,實(shí)例代碼如下所示:

//創(chuàng)建一個(gè)Customers數(shù)據(jù)表

DataTable dt = new DataTable("Customers");

//添加兩列CustID,CustLName數(shù)據(jù)類型分別為Int32,String,并添加到數(shù)據(jù)表中

DataColumn dc1 = new DataColumn("CustID", Type.GetType("System.Int32"));

DataColumn dc2 = new DataColumn("CustLName", Type.GetType("System.String"));

dt.Columns.Add(dc1);

dt.Columns.Add(dc2);

//利用循環(huán)創(chuàng)建數(shù)據(jù)行并賦值,添加到數(shù)據(jù)表中

for (int i = 0; i < al.Count; i++)

{

DataRow dr = dt.NewRow();

DS_Option dso = (DS_Option)al[i];

dr["CustID"] = dso.ID;

dr["CustLName"] = dso.Name;

dt.Rows.Add(dr);

}

//將數(shù)據(jù)表中的數(shù)據(jù)寫入到XML文件中

string xmlstr;

System.IO.StringWriter writer = new System.IO.StringWriter();

dt.WriteXml(writer);

xmlstr = writer.ToString();

return xmlstr;

有了向XML文件寫數(shù)據(jù)的操作,當(dāng)然也可以從XML文件中讀取數(shù)據(jù)信息到DataTable數(shù)據(jù)表中,方法累也類似,但要先建立好打DataTable的結(jié)構(gòu),不然會(huì)出錯(cuò)。

實(shí)例代碼如下所示:

string tbxml = xmlinfo;

DataTable dt = new DataTable("Customers ");

DataColumn dc1 = new DataColumn("CustID", Type.GetType("System.Int32"));

DataColumn dc2 = new DataColumn("CustLName", Type.GetType("System.String"));

dt.Columns.Add(dc1);

dt.Columns.Add(dc2);

System.IO.StringReader reader = new System.IO.StringReader(tbxml);

dt.ReadXml(reader);

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多