全面的ASP.NET DataTable的操作大全

來源:互聯網
上載者:User

DataTable表示一個與記憶體有關的資料表,可以使用工具列裡面的控制項拖放來建立和使用,也可以在編寫程式過程中根據需要獨立建立和使用,最常見的情況是作為DataSet的成員使用,在這種情況下就需要用在編程過程中根據需要動態建立資料表。那麼在8.4節中主要講用編碼的方式來建立DataTable資料表以及對它的操作。

1 代碼建立DataTable資料表

如上8.3節裡面所講,通過添加對象的方式直接在DataSet中建立資料表,可以通過使用Add方法將DataTable添加到DataSet中,這種是使用控制項的可視化添加DataTable的操作,那麼在代碼中怎麼來建立DataTable資料表呢?

在程式中建立DataTable對象可以使用相應的DataTable建構函式。建立一個表名為TableName的資料表,實現代碼如下所示:

DataTable NewTable = new DataTable(TableName);

另外也可以通過以下方法建立DataTable對象:使用DataAdapter對象的Fill方法或FillSchema方法在DataSet中建立,這種方式都用於與資料庫相串連操作的情況下。實現代碼如下所示:

//資料庫聯結字串

string connectionString =

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

//sql語句查詢

string commandString = "Select * from Customers";

// 建立SqlDataAdapter對象,並執行sql命令

SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);

//建立資料集dataSet

DataSet dataSet = new DataSet();

//把資料表添加到資料集中

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

//將資料填充到資料集中

dataAdapter.Fill(dataSet,"Customers");

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

使用DataTable建構函式初次建立DataTable時,是沒有架構(即結構,沒有列)的。沒有架構的DataTable資料表示沒有辦法使用的,因此要在使用這種DataTable資料表之前要定義表的架構,必須建立DataColumn對象並將其添加到表的Columns集合中。如何使用代碼建立Columns列,將在本章後面幾節中講到。

建立DataTable時,不需要為TableName屬性提供值,可以在其他時間指定該屬性,或者將其保留為空白,這些都不影響DataTable的使用。應該注意的是在將一個沒有TableName值的表添加到DataSet中時,該表會得到一個從“Table”(表示Table0)開始遞增的預設名稱TableN。

以下樣本建立DataTable對象的執行個體,並為其指定名稱“Customers”。 實現代碼如下所示:

DataTable workTable = new DataTable("Customers");

以下代碼是將建立的DataTable執行個體Customers表添加到DataSet的Tables集合中。實現代碼如下所示:

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列

前面已經學過使用代碼建立DataTable,但是使用DataTable建構函式初次建立 DataTable時,是沒有架構(即結構,沒有列)的。要定義表的架構,必須建立DataColumn 對象並將其添加到表的Columns集合中。也可以為表定義主鍵列,並且可以建立Constraint約束對象並將其添加到表的Constraints約束集合中。

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

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

通過使用DataColumn建構函式,或者通過調用表的Columns屬性的Add方法,可在表內建立DataColumn對象。Add方法將接受可選的ColumnName、DataType參數,並將建立新的DataColumn作為集合的成員。它還會接受現有的DataColumn對象並會將其添加到集合中,並會根據請求返回對所添加的DataColumn的引用。

以下樣本向DataTable中添加了四列。實現代碼如下所示:

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:資料表Customers中的列名。

3 設定DataTable資料表的主鍵

資料庫開發的一個通常規則就是表至少得有一個列作為主鍵。主鍵約束用於惟一標識給定表中的一條記錄(行)。假設現在需要建立一個DataColumn列來表示EmpID欄位並且要將這個列將作為表的主鍵,它必須有AllowDBNull和Unique屬性,實現代碼如下所示:

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列的屬性設定為不允許DBNull值並將值約束為唯一。但是,如果將CustID列定義為表的主鍵列,AllowDBNull屬性就會自動化佈建為false,並且Unique屬性會自動化佈建為true。

4 設定列的資料類型

通過上面8.4.2節的學習已經知道怎麼向建立的資料表中添加列了,那麼下面來看一看,怎麼為添加的列設定列的資料類型。資料類型是標明一列資料的資料類型屬性,根據不同的需要可以在DataTable資料表中建立不同的列,並可以為不同的列設定不同的資料類型,來滿足需要。繼續上面Customers表的例子,為建立的列添加資料類型:

實現代碼如下所示:

//建立一個資料表Customers

DataTable CustomersTable = new DataTable("Customers");

//建立一個Int32類型名稱是CustID列,把這個列設定成主鍵,並且不允許為空白,

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

CustomersCol.AllowDBNull = false;

CustomersCol.Unique = true;

//建立三個String類型的列CustLName,CustFName,Purchases

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

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

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

代碼說明:

樣本中用於CustID列定義為表的主鍵列。CustID列指定的資料類型是Int32,CustLName列、CustFName列、Purchases列指定的資料類型都是String的列,當然也可以不設定列的資料類型,在這個時候DataColumn的DataType屬性預設為字串類型,當然可以根據需要在建立列名時進行列資料類型的設定。

5 啟用Autoincrementing欄位

在8.4.4節中學會了如何設定DataColumn列的資料類型,在設定完DataColumn列的資料類型以後,也可以像SQL-Server資料庫表一樣把某一列設定成自動遞增的。簡單地說,自動增加列可以確保當一個新行被添加到給定表時,可以基於當前的遞增步長值自動指定這個列的值。特別是某一列作為沒有重複值得主鍵的時候,這個功能就特別有用。在DataTable中這個功能可以用AutoIncrement(列是否將列的值自動遞增)、AutoIncrementSeed(起始值,種子值)和AutoIncrementStep(步長)屬性來控制。

下面是建立一個支援自動遞增的DataColumn列的例子。種子值用於標記列的起始值,步長值表示遞增時增加種子值的數值,代碼如下所示:

// 建立一個新列

DataColumn myColumn = new DataColumn();

myColumn.ColumnName = " CustID ";

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

 // 設定自動遞增

myColumn.AutoIncrement = true;

myColumn.AutoIncrementSeed = 0;

myColumn.AutoIncrementStep = 1;

代碼說明:

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

q       AutoIncrementSeed:起始值種子值,AutoIncrement屬性設定為true的列的起始值。

q       AutoIncrementStep:步長,遞增量,AutoIncrement屬性設定為true的列的步長。

建立一個資料類型為Int32的CustID列,為了能使這個欄位的值實現自動增加的效果,把列AutoIncrement屬性設定為true;把列得種子值AutoIncrementSeed定為0,也就是從0開始計數;同時設定自動增加的步長AutoIncrementStep為1,每次增加一個。由於種子值被定為0,前面5個值應該是0、1、2、3和4。

可以往一個DataTable中添加這個DataColumn來測試一下。然後往這個表中添加一些新行,當然會自動轉儲CustID列中的值,代碼如下所示:

//實現列自動增加功能

    protected void Button1_Click(object sender, EventArgs e)

    {

        //建立一個新的資料列,名稱:CustID ,資料類型:Int32.

        DataColumn myColumn = new DataColumn();

        myColumn.ColumnName = " CustID ";

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

        //把新建立的列設定自動增加,種子為0,增加步長為1.

        myColumn.AutoIncrement = true;

        myColumn.AutoIncrementSeed = 0;

        myColumn.AutoIncrementStep = 1;

        //把這個列添加到Customers表中.

        DataTable CustomersTable = new DataTable("Customers");

        myTable. CustomersTable.Add(myColumn);

        //添加20個新行.

        DataRow r;

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

        {

            r = CustomersTable.NewRow();

            CustomersTable.Rows.Add(r);

        }

        //顯示每一行的資料值.

        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程式中,運行後點擊“Button”按鈕,就會得出初始值為0的步長為1的一系列數,結果如圖:8.4.1所示的顯示結果。

6 用編程方式添加DataTable行

在為DataTable定義了架構之後,也就是設定好了需要的列名以後,就可以可通過將DataRow對象添加到表的Rows集合中來將資料行添加到表中。與添加DataColumn類似,同樣可以通過使用DataRow建構函式,或者通過調用表的Rows屬性的Add方法,可在表內建立DataRow對象。

DataColumn對象集合表示了表的模式(Schema)。DataTable通過內部的DataColumnCollection類型儲存表中所有列。相反,DataRow類型集合就表示表中的實際資料。這樣,如果Customers表中有10個記錄,就可以使用10個DataRow類型來表示它們。使用DataRow類的成員可以對錶中的值進行插入、刪除、求值和操作操作。

建立一個DataRow資料行的對象,實現代碼如下所示:

//建立一個Customers資料表

DataTable CustomersTable = new DataTable("Customers ");

//建立一個新的資料行

DataRow arow = CustomersTable.NewRow();

//設定行的值

arow[ColumnName] = DataValue;

//把資料行添加建立的Customers資料表中

CustomersTable.Rows.Add(arow);

功能說明:

建立一行arow, 並給這行某一個列名付值為DataValue,最後把這一行添加到Customers表中。使用DataRow與使用DataColumn有些不同,因為不可以直接建立這個類型的執行個體,而是獲得一個來自給定DataTable的引用。例如,假設想往Customers表中添加新行,DataTable.NewRow()方法可以獲得下一空位,然後在上面填充每列的資料。

實現代碼如下所示:

//建立一個資料表

DataTable CustomersTable = new DataTable("Customers");

//聲明資料表的行和列變數

DataColumn column;

DataRow row;

//建立一個新列,設定列的資料列性和列名,並把這個新列添加到Customers表中

column=new DataColumn();

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

column.ColumnName = " CustID ";

CustomersTable.Columns.Add(column);

//再建立一個新列

column = new DataColumn();

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

column.ColumnName = " CustLName ";

CustomersTable.Columns.Add(column);

//建立新的一行並把這個行添加到Customers表中

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

{

row = CustomersTable.NewRow();

row["CustID "] = i;

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

CustomersTable.Rows.Add(row);

}

功能說明:

向CustomersTable表建立兩個列分別是CustID, CustLName,然後用迴圈的方式產生10行並附值,添加到CustomersTable表中。

7 操作DataTable:更新行

在前面一節裡面講了,怎麼樣添加一個DataRow行,那麼下面需要瞭解的關於DataTable的另一個方面就是怎樣用新值更新已有的DataRow行。下面開始介紹關於DataTable更新行的問題。

最常使用的一個方法就是先用Select()方法獲得符合給定過濾條件的行。一旦獲得這些DataRow,就對它們作相應的修改。例如,假定有一個新按鈕在被單擊後,搜尋DataTable中所有EmployeeID列值為5的行。一旦標識這些項後,就可以把EmployeeID列對應值5改為6。執行個體代碼如下:

//資料庫聯結字串

string connectionString =

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

//sql語句把Orders表中的資料資訊都取出來

string commandString = "Select * from Orders";

SqlDataAdapter dataAdapter = new SqlDataAdapter(commandString, connectionString);

DataSet dataSet = new DataSet(  );

//填充資料集

dataAdapter.Fill(dataSet," Orders");

//填充資料表

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

// 建立一個用於過濾出EmployeeID列值為5的行的行的變數

string filterStr = "EmployeeID=5";

string strEmployeeID = null;

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

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

// EmployeeID列對應值5改為6

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

{

DataRow temp = EmployeeID [i];

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

EmployeeID [i] = temp;

}

8 用編程方式刪除DataTable行

用於從DataTable對象中刪除DataRow對象的方法有兩種:DataRowCollection對象的 Remove方法和DataRow對象的Delete方法。

Remove方法和Delete方法都可以將DataTable的行DataRow刪除,但是前者是從DataRowCollection中刪除DataRow,而後者只將行標記為刪除。當應用程式調用AcceptChanges方法時,才會發生實際的刪除。通過使用Delete,可以在實際刪除之前先以編程方式檢查哪些行標記為刪除。如果將行標記為刪除,其RowState屬性會設定為Deleted。

在將DataSet或DataTable與DataAdapter和關係型資料來源一起使用時,用DataRow的 Delete方法移除行。Delete方法只是在DataSet或DataTable中將行標記為Deleted,而不會移除它。而DataAdapter在遇到標記為Deleted的行時,會執行其DeleteCommand方法以在資料來源中刪除該行。然後,就可以用AcceptChanges方法永久移除該行。如果使用Remove 刪除該行,則該行將從表中完全移除,但DataAdapter不會在資料來源中刪除該行。

DataRowCollection的Remove方法採用DataRow作為參數,並將其從集合中移除,實現代碼如下所示:

DataTable CustomersTable = new DataTable("Customers ");

DataRow workRow = empTable.NewRow();

CustomersTable.Rows.Remove(workRow);

作為對比,以下樣本示範了如何調用DataRow上的Delete方法來將其RowState改為Deleted。實現代碼如下所示:

DataTable CustomersTable = new DataTable("Customers ");

DataRow workRow = empTable.NewRow();

workRow.Delete();

如果將行標記為刪除,並且調用DataTable對象的AcceptChanges方法,該行就會從DataTable中移除。相比之下,如果調用RejectChanges,行的RowState就會恢複到被標記為Deleted之前的狀態。

9 向DataTable填充資料

ADO.NET中的DataSet是資料的記憶體駐留表示形式,它提供了獨立於資料來源的一致關係編程模型。DataSet表示整個資料集,其中包含表、約束和表之間的關係。由於DataSet獨立於資料來源,DataSet可以包含應用程式本地的資料,也可以包含來自多個資料來源的資料。與現有資料來源的互動通過DataAdapter來控制。

DataAdapter的SelectCommand屬性是一個Command對象,用於從資料來源中檢索資料。DataAdapter的InsertCommand、UpdateCommand和DeleteCommand屬性也是Command對象,用於按照對DataSet中資料的修改來管理對資料來源中資料的更新。

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

Fill方法使用DataReader對象來隱式地返回用於在DataSet中建立表的列名稱和類型以及用於填充DataSet中的表行的資料。表和列僅在不存在時才建立;否則,Fill將使用現有的DataSet架構。

以下程式碼範例使用SqlDataAdapter對象擷取Microsoft SQL Server Northwind資料庫的資料填充到Customers資料集中的Customers表。

實現代碼如下所示:

//使用DataAdapter的Fill方法向Customers表中填充資料

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實作類別似sql語句的查詢功能

在脫離資料庫的DataSet實作類別似sql語句的查詢。

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

將從DataSet中查詢出來的資料以行的形式儲存到arow中。

實現代碼如下所示:

DataSet ds= new DataSet();

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

代碼說明:

qTableName:資料集ds中的表名。

qColumnsName:TableName表中的某一列名。

qDataValue:和列名對應參數的值。

功能說明:

上面語句功能相當於sql語句中的查詢語句

Select * From TableName where ColumnsName= DataValue

11  DataTable中資料記錄的統計

在使用資料庫時例如SQL-Server、Oracle這些資料庫,可以輕鬆的通過統計和計算函數例如Sum、Aver、Count等統計或計算出相關結果,那麼,在已經把資料檢索出來的DataTable資料集中能否同樣使用呢?在程式中根據需要動態建立的DataTable是沒有辦法使用sql語句進行查詢統計的,例如沒有辦法使用Select語句來擷取查詢統計結果。那麼在DataTable中怎麼來進行統計呢?

    本節將介紹一個簡單的方法,可以輕鬆的獲得DataTable中的記錄統計結果。這個簡單的方法就是調用功能強大的DataTable的函數Compute。

函數如下:

public object Compute(string expression,string filter)

參數說明:

qexpression 參數需要彙總函式,要計算的運算式字串,基本上類似於Sql Server中的統計運算式。例如,以下是合法運算式:Count(ID)。

qfilter:統計的過濾字串,只有滿足這個過濾條件的記錄才會被統計,也就是確定在運算式中使用哪些行。

    以下樣本,以SQL-Server資料庫中的Northwind資料庫中的Orders資料表,描述訂單資訊,包含欄位為:訂單號(OrderID)、客戶編碼(CustomerID)、職工編號(EmployeeID)、訂貨時間(OrderDate)、船號(ShipVia)、運費(Freight)。

1.統計所有職工編號EmployeeID為5的數量:

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

2.統計所有運費Freight中運費大於100的個數

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

3.統計運費Freight的平均值

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

4.統計職工編號EmployeeID為5的運費總額:

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

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

//建立一個資料集

DataSet customers = new DataSet();

//在資料集中添加一個名稱為CustomersTable的資料表

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

//建立一個新行並添加到CustomersTable資料表中

DataRow dataRow = new DataRow();

dataRow= customersTable.NewRow();

//然後就是統計了,聲明連個int 變數i:迴圈變數, colCnt: customersTable表中的列數

int i ;

int colCnt ;

colCnt = customersTable.Cols.Count;

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

//求第i列的和並且結果賦值給新的dataRow資料行

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

//把資料行添加到customersTable資料表中

customersTable.Rows.Add(dataRow);

12 DataTable和xml的一些應用總結

在ASP.NET2.0中ADO.NET和XML結合的很緊密,第7章中已經詳細介紹了在ADO.NET中的資料通過DataSet很容易存取在XML中的,那麼在DataTable能像在DataSet中那樣操作XML資料檔案嗎?答案是可以的,下面就是一個將DataTable中的資料寫入到XML檔案中去的操作,執行個體代碼如下所示:

//建立一個Customers資料表

DataTable dt = new DataTable("Customers");

//添加兩列CustID,CustLName資料類型分別為Int32,String,並添加到資料表中

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);

//利用迴圈建立資料行並賦值,添加到資料表中

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);

}

//將資料表中的資料寫入到XML檔案中

string xmlstr;

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

dt.WriteXml(writer);

xmlstr = writer.ToString();

return xmlstr;

有了向XML檔案寫資料的操作,當然也可以從XML檔案中讀取資料資訊到DataTable資料表中,方法累也類似,但要先建立好打DataTable的結構,不然會出錯。

執行個體代碼如下所示:

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);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.