DataTable表示一個與內(nèi)存有關的數(shù)據(jù)表,可以使用工具欄里面的控件拖放來創(chuàng)建和使用,也可以在編寫程序過程中根據(jù)需要獨立創(chuàng)建和使用,最常見的情況是作為DataSet的成員使用,在這種情況下就需要用在編程過程中根據(jù)需要動態(tài)創(chuàng)建數(shù)據(jù)表。
1 代碼創(chuàng)建DataTable數(shù)據(jù)表
通過添加對象的方式直接在DataSet中創(chuàng)建數(shù)據(jù)表,可以通過使用Add方法將DataTable添加到DataSet中,這種是使用控件的可視化添加DataTable的操作,那么在代碼中怎么來創(chuàng)建DataTable數(shù)據(jù)表呢?
在程序中創(chuàng)建DataTable對象可以使用相應的DataTable構造函數(shù)。創(chuàng)建一個表名為TableName的數(shù)據(jù)表,實現(xiàn)代碼如下所示:
- DataTable NewTable = new DataTable(TableName);
另外也可以通過以下方法創(chuàng)建DataTable對象:使用DataAdapter對象的Fill方法或FillSchema方法在DataSet中創(chuàng)建,這種方式都用于與數(shù)據(jù)庫相連接操作的情況下。實現(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對象,并執(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");
注意:將一個DataTable作為成員添加到一個DataSet的Tables集合中后,不能再將其添加到任何其他DataSet的表集合中。
使用DataTable構造函數(shù)初次創(chuàng)建DataTable時,是沒有架構(即結構,沒有列)的。沒有架構的DataTable數(shù)據(jù)表示沒有辦法使用的,因此要在使用這種DataTable數(shù)據(jù)表之前要定義表的架構,必須創(chuàng)建DataColumn對象并將其添加到表的Columns集合中。如何使用代碼創(chuàng)建Columns列,將在本章后面幾節(jié)中講到。
創(chuàng)建DataTable時,不需要為TableName屬性提供值,可以在其他時間指定該屬性,或者將其保留為空,這些都不影響DataTable的使用。應該注意的是在將一個沒有TableName值的表添加到DataSet中時,該表會得到一個從“Table”(表示Table0)開始遞增的默認名稱TableN。
以下示例創(chuàng)建DataTable對象的實例,并為其指定名稱“Customers”。 實現(xiàn)代碼如下所示:
- DataTable workTable = new DataTable("Customers");
以下代碼是將創(chuàng)建的DataTable實例Customers表添加到DataSet的Tables集合中。實現(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)學過使用代碼創(chuàng)建DataTable,但是使用DataTable構造函數(shù)初次創(chuàng)建 DataTable時,是沒有架構(即結構,沒有列)的。要定義表的架構,必須創(chuàng)建DataColumn 對象并將其添加到表的Columns集合中。也可以為表定義主鍵列,并且可以創(chuàng)建Constraint約束對象并將其添加到表的Constraints約束集合中。
DataColumn類型表示了DataTable上的一列。總的來說,綁定到某個DataTable的所有DataColumn類型的集合就表示一個表。
DataTable包含了由表的Columns屬性引用的DataColumn對象的集合。這個列的集合與任何約束一起定義表的架構(即結構)。
通過使用DataColumn構造函數(shù),或者通過調(diào)用表的Columns屬性的Add方法,可在表內(nèi)創(chuàng)建DataColumn對象。Add方法將接受可選的ColumnName、DataType參數(shù),并將創(chuàng)建新的DataColumn作為集合的成員。它還會接受現(xiàn)有的DataColumn對象并會將其添加到集合中,并會根據(jù)請求返回對所添加的DataColumn的引用。
以下示例向DataTable中添加了四列。實現(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");
代碼說明:
CustID,CustLName,CustFName,Purchases:數(shù)據(jù)表Customers中的列名。
3 設置DataTable數(shù)據(jù)表的主鍵
數(shù)據(jù)庫開發(fā)的一個通常規(guī)則就是表至少得有一個列作為主鍵。主鍵約束用于惟一標識給定表中的一條記錄(行)。假設現(xiàn)在需要新建一個DataColumn列來表示EmpID字段并且要將這個列將作為表的主鍵,它必須有AllowDBNull和Unique屬性,實現(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列的屬性設置為不允許DBNull值并將值約束為唯一。但是,如果將CustID列定義為表的主鍵列,AllowDBNull屬性就會自動設置為false,并且Unique屬性會自動設置為true。
4 設置列的數(shù)據(jù)類型
通過上面8.4.2節(jié)的學習已經(jīng)知道怎么向新建的數(shù)據(jù)表中添加列了,那么下面來看一看,怎么為添加的列設置列的數(shù)據(jù)類型。數(shù)據(jù)類型是標明一列數(shù)據(jù)的數(shù)據(jù)類型屬性,根據(jù)不同的需要可以在DataTable數(shù)據(jù)表中建立不同的列,并可以為不同的列設置不同的數(shù)據(jù)類型,來滿足需要。繼續(xù)上面Customers表的例子,為創(chuàng)建的列添加數(shù)據(jù)類型:
實現(xiàn)代碼如下所示:
- //創(chuàng)建一個數(shù)據(jù)表Customers
- DataTable CustomersTable = new DataTable("Customers");
- //創(chuàng)建一個Int32類型名稱是CustID列,把這個列設置成主鍵,并且不允許為空,
- DataColumn CustomersCol = CustomersTable.Columns.Add("CustID", typeof(Int32));
- CustomersCol.AllowDBNull = false;
- CustomersCol.Unique = true;
- //創(chuàng)建三個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的列,當然也可以不設置列的數(shù)據(jù)類型,在這個時候DataColumn的DataType屬性默認為字符串類型,當然可以根據(jù)需要在創(chuàng)建列名時進行列數(shù)據(jù)類型的設置。
5 啟用Autoincrementing字段
在8.4.4節(jié)中學會了如何設置DataColumn列的數(shù)據(jù)類型,在設置完DataColumn列的數(shù)據(jù)類型以后,也可以像SQL-Server數(shù)據(jù)庫表一樣把某一列設置成自動遞增的。簡單地說,自動增加列可以確保當一個新行被添加到給定表時,可以基于當前的遞增步長值自動指定這個列的值。特別是某一列作為沒有重復值得主鍵的時候,這個功能就特別有用。在DataTable中這個功能可以用AutoIncrement(列是否將列的值自動遞增)、AutoIncrementSeed(起始值,種子值)和AutoIncrementStep(步長)屬性來控制。
下面是創(chuàng)建一個支持自動遞增的DataColumn列的例子。種子值用于標記列的起始值,步長值表示遞增時增加種子值的數(shù)值,代碼如下所示:
- // 創(chuàng)建一個新列
- DataColumn myColumn = new DataColumn();
- myColumn.ColumnName = " CustID ";
- myColumn.DataType = System.Type.GetType("System.Int32");
- // 設置自動遞增
- myColumn.AutoIncrement = true;
- myColumn.AutoIncrementSeed = 0;
- myColumn.AutoIncrementStep = 1;
代碼說明:
AutoIncrement:列是否將列的值自動遞增,true表示自動遞增,false表示不能自動遞增。
AutoIncrementSeed:起始值種子值,AutoIncrement屬性設置為true的列的起始值。
AutoIncrementStep:步長,遞增量,AutoIncrement屬性設置為true的列的步長。
創(chuàng)建一個數(shù)據(jù)類型為Int32的CustID列,為了能使這個字段的值實現(xiàn)自動增加的效果,把列AutoIncrement屬性設置為true;把列得種子值AutoIncrementSeed定為0,也就是從0開始計數(shù);同時設置自動增加的步長AutoIncrementStep為1,每次增加一個。由于種子值被定為0,前面5個值應該是0、1、2、3和4。
可以往一個DataTable中添加這個DataColumn來測試一下。然后往這個表中添加一些新行,當然會自動轉(zhuǎn)儲CustID列中的值,代碼如下所示:
- //實現(xiàn)列自動增加功能
- protected void Button1_Click(object sender, EventArgs e)
- {
- //創(chuàng)建一個新的數(shù)據(jù)列,名稱:CustID ,數(shù)據(jù)類型:Int32.
- DataColumn myColumn = new DataColumn();
- myColumn.ColumnName = " CustID ";
- myColumn.DataType = System.Type.GetType("System.Int32");
- //把新創(chuàng)建的列設置自動增加,種子為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);
- }
- //顯示每一行的數(shù)據(jù)值.
- string temp = "";
- DataRowCollection rows = CustomersTable.Rows;
- for (int i = 0; i < CustomersTable.Rows.Count; i++)
- {
- DataRow currRow = rows;
- temp += currRow["CustID "] + " ";
- }
- //在Label1面顯示所有值
- Label1.Text = Label1.Text+temp;
- }
如果把上面代碼寫在建立的Web程序中,運行后點擊“Button”按鈕,就會得出初始值為0的步長為1的一系列數(shù),
6 用編程方式添加DataTable行
在為DataTable定義了架構之后,也就是設置好了需要的列名以后,就可以可通過將DataRow對象添加到表的Rows集合中來將數(shù)據(jù)行添加到表中。與添加DataColumn類似,同樣可以通過使用DataRow構造函數(shù),或者通過調(diào)用表的Rows屬性的Add方法,可在表內(nèi)創(chuàng)建DataRow對象。
DataColumn對象集合表示了表的模式(Schema)。DataTable通過內(nèi)部的DataColumnCollection類型保存表中所有列。相反,DataRow類型集合就表示表中的實際數(shù)據(jù)。這樣,如果Customers表中有10個記錄,就可以使用10個DataRow類型來表示它們。使用DataRow類的成員可以對表中的值進行插入、刪除、求值和操作操作。
創(chuàng)建一個DataRow數(shù)據(jù)行的對象,實現(xiàn)代碼如下所示:
- //創(chuàng)建一個Customers數(shù)據(jù)表
- DataTable CustomersTable = new DataTable("Customers ");
- //創(chuàng)建一個新的數(shù)據(jù)行
- DataRow arow = CustomersTable.NewRow();
- //設置行的值
- arow[ColumnName] = DataValue;
- //把數(shù)據(jù)行添加創(chuàng)建的Customers數(shù)據(jù)表中
- CustomersTable.Rows.Add(arow);
功能說明:
新建一行arow, 并給這行某一個列名付值為DataValue,最后把這一行添加到Customers表中。使用DataRow與使用DataColumn有些不同,因為不可以直接創(chuàng)建這個類型的實例,而是獲得一個來自給定DataTable的引用。例如,假設想往Customers表中添加新行,DataTable.NewRow()方法可以獲得下一空位,然后在上面填充每列的數(shù)據(jù)。
實現(xiàn)代碼如下所示:
- //創(chuàng)建一個數(shù)據(jù)表
- DataTable CustomersTable = new DataTable("Customers");
- //聲明數(shù)據(jù)表的行和列變量
- DataColumn column;
- DataRow row;
- //創(chuàng)建一個新列,設置列的數(shù)據(jù)列性和列名,并把這個新列添加到Customers表中
- column=new DataColumn();
- column.DataType = System.Type.GetType("System.Int32");
- column.ColumnName = " CustID ";
- CustomersTable.Columns.Add(column);
- //再創(chuàng)建一個新列
- column = new DataColumn();
- column.DataType = Type.GetType("System.String");
- column.ColumnName = " CustLName ";
- CustomersTable.Columns.Add(column);
- //創(chuàng)建新的一行并把這個行添加到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)建兩個列分別是CustID, CustLName,然后用循環(huán)的方式產(chǎn)生10行并附值,添加到CustomersTable表中。
7 操作DataTable:更新行
在前面一節(jié)里面講了,怎么樣添加一個DataRow行,那么下面需要了解的關于DataTable的另一個方面就是怎樣用新值更新已有的DataRow行。下面開始介紹關于DataTable更新行的問題。
最常使用的一個方法就是先用Select()方法獲得符合給定過濾條件的行。一旦獲得這些DataRow,就對它們作相應的修改。例如,假定有一個新按鈕在被單擊后,搜索DataTable中所有EmployeeID列值為5的行。一旦標識這些項后,就可以把EmployeeID列對應值5改為6。實例代碼如下:
- //數(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");
- // 建立一個用于過濾出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 ;
- strEmployeeID += temp["EmployeeID "] = 6;
- EmployeeID = temp;
- }
8 用編程方式刪除DataTable行
用于從DataTable對象中刪除DataRow對象的方法有兩種:DataRowCollection對象的 Remove方法和DataRow對象的Delete方法。
Remove方法和Delete方法都可以將DataTable的行DataRow刪除,但是前者是從DataRowCollection中刪除DataRow,而后者只將行標記為刪除。當應用程序調(diào)用AcceptChanges方法時,才會發(fā)生實際的刪除。通過使用Delete,可以在實際刪除之前先以編程方式檢查哪些行標記為刪除。如果將行標記為刪除,其RowState屬性會設置為Deleted。
在將DataSet或DataTable與DataAdapter和關系型數(shù)據(jù)源一起使用時,用DataRow的 Delete方法移除行。Delete方法只是在DataSet或DataTable中將行標記為Deleted,而不會移除它。而DataAdapter在遇到標記為Deleted的行時,會執(zhí)行其DeleteCommand方法以在數(shù)據(jù)源中刪除該行。然后,就可以用AcceptChanges方法永久移除該行。如果使用Remove 刪除該行,則該行將從表中完全移除,但DataAdapter不會在數(shù)據(jù)源中刪除該行。
DataRowCollection的Remove方法采用DataRow作為參數(shù),并將其從集合中移除,實現(xiàn)代碼如下所示:
- DataTable CustomersTable = new DataTable("Customers ");
- DataRow workRow = empTable.NewRow();
- CustomersTable.Rows.Remove(workRow);
作為對比,以下示例演示了如何調(diào)用DataRow上的Delete方法來將其RowState改為Deleted。實現(xiàn)代碼如下所示:
- DataTable CustomersTable = new DataTable("Customers ");
- DataRow workRow = empTable.NewRow();
- workRow.Delete();
如果將行標記為刪除,并且調(diào)用DataTable對象的AcceptChanges方法,該行就會從DataTable中移除。相比之下,如果調(diào)用RejectChanges,行的RowState就會恢復到被標記為Deleted之前的狀態(tài)。
9 向DataTable填充數(shù)據(jù)
ADO.NET中的DataSet是數(shù)據(jù)的內(nèi)存駐留表示形式,它提供了獨立于數(shù)據(jù)源的一致關系編程模型。DataSet表示整個數(shù)據(jù)集,其中包含表、約束和表之間的關系。由于DataSet獨立于數(shù)據(jù)源,DataSet可以包含應用程序本地的數(shù)據(jù),也可以包含來自多個數(shù)據(jù)源的數(shù)據(jù)。與現(xiàn)有數(shù)據(jù)源的交互通過DataAdapter來控制。
DataAdapter的SelectCommand屬性是一個Command對象,用于從數(shù)據(jù)源中檢索數(shù)據(jù)。DataAdapter的InsertCommand、UpdateCommand和DeleteCommand屬性也是Command對象,用于按照對DataSet中數(shù)據(jù)的修改來管理對數(shù)據(jù)源中數(shù)據(jù)的更新。
DataAdapter的Fill方法用于使用DataAdapter的SelectCommand的結果來填充DataSet。Fill將要填充的DataSet和DataTable對象(或要使用從SelectCommand中返回的行來填充的DataTable的名稱)作為它的參數(shù)。
Fill方法使用DataReader對象來隱式地返回用于在DataSet中創(chuàng)建表的列名稱和類型以及用于填充DataSet中的表行的數(shù)據(jù)。表和列僅在不存在時才創(chuàng)建;否則,F(xiàn)ill將使用現(xiàn)有的DataSet架構。
以下代碼示例使用SqlDataAdapter對象獲取Microsoft SQL Server Northwind數(shù)據(jù)庫的數(shù)據(jù)填充到Customers數(shù)據(jù)集中的Customers表。
實現(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實現(xiàn)類似sql語句的查詢功能
在脫離數(shù)據(jù)庫的DataSet實現(xiàn)類似sql語句的查詢。
也就是(select ... from tablename where ...)這樣的功能。
將從DataSet中查詢出來的數(shù)據(jù)以行的形式保存到arow中。
實現(xiàn)代碼如下所示:
- DataSet ds= new DataSet();
- DataRow[] arow = ds.Tables[TableName].Select("" + ColumnsName+ "='" + DataValue + "'");
代碼說明:
TableName:數(shù)據(jù)集ds中的表名。
ColumnsName:TableName表中的某一列名。
DataValue:和列名對應參數(shù)的值。
功能說明:
上面語句功能相當于sql語句中的查詢語句
- Select * From TableName where ColumnsName= DataValue
11 DataTable中數(shù)據(jù)記錄的統(tǒng)計
在使用數(shù)據(jù)庫時例如SQL-Server、Oracle這些數(shù)據(jù)庫,可以輕松的通過統(tǒng)計和計算函數(shù)例如Sum、Aver、Count等統(tǒng)計或計算出相關結果,那么,在已經(jīng)把數(shù)據(jù)檢索出來的DataTable數(shù)據(jù)集中能否同樣使用呢?在程序中根據(jù)需要動態(tài)創(chuàng)建的DataTable是沒有辦法使用sql語句進行查詢統(tǒng)計的,例如沒有辦法使用Select語句來獲取查詢統(tǒng)計結果。那么在DataTable中怎么來進行統(tǒng)計呢?
本節(jié)將介紹一個簡單的方法,可以輕松的獲得DataTable中的記錄統(tǒng)計結果。這個簡單的方法就是調(diào)用功能強大的DataTable的函數(shù)Compute。
函數(shù)如下:
- public object Compute(string expression,string filter)
參數(shù)說明:
qexpression 參數(shù)需要聚合函數(shù),要計算的表達式字符串,基本上類似于Sql Server中的統(tǒng)計表達式。例如,以下是合法表達式:Count(ID)。
qfilter:統(tǒng)計的過濾字符串,只有滿足這個過濾條件的記錄才會被統(tǒng)計,也就是確定在表達式中使用哪些行。
以下示例,以SQL-Server數(shù)據(jù)庫中的Northwind數(shù)據(jù)庫中的Orders數(shù)據(jù)表,描述訂單信息,包含字段為:訂單號(OrderID)、客戶編號(CustomerID)、職工編號(EmployeeID)、訂貨時間(OrderDate)、船號(ShipVia)、運費(Freight)。
1.統(tǒng)計所有職工編號EmployeeID為5的數(shù)量:
- table.Compute("Count(*)","EmployeeID=5");
2.統(tǒng)計所有運費Freight中運費大于100的個數(shù)
- table.Compute("Count(*)","Freight>100'");
3.統(tǒng)計運費Freight的平均值
- table.Compute("Aver(Freight)","true");
4.統(tǒng)計職工編號EmployeeID為5的運費總額:
- table.Compute("Sum(Freight)"," EmployeeID=5");
以上都是計算每一列的合計,那么要添加一行求合計可以使用下面的方法:
- //創(chuàng)建一個數(shù)據(jù)集
- DataSet customers = new DataSet();
- //在數(shù)據(jù)集中添加一個名稱為CustomersTable的數(shù)據(jù)表
- DataTable customersTable = customers.Tables.Add("CustomersTable");
- //創(chuàng)建一個新行并添加到CustomersTable數(shù)據(jù)表中
- DataRow dataRow = new DataRow();
- dataRow= customersTable.NewRow();
- //然后就是統(tǒng)計了,聲明連個int 變量i:循環(huán)變量, colCnt: customersTable表中的列數(shù)
- int i ;
- int colCnt ;
- colCnt = customersTable.Cols.Count;
- for( i=0 ;i< colCnt -1;i++)
- //求第i列的和并且結果賦值給新的dataRow數(shù)據(jù)行
- dataRow(i)= customersTable.Compute("Sum("+i.ToString()+")","true");
- //把數(shù)據(jù)行添加到customersTable數(shù)據(jù)表中
- customersTable.Rows.Add(dataRow);
12 DataTable和xml的一些應用總結
在ASP.NET2.0中ADO.NET和XML結合的很緊密,第7章中已經(jīng)詳細介紹了在ADO.NET中的數(shù)據(jù)通過DataSet很容易存取在XML中的,那么在DataTable能像在DataSet中那樣操作XML數(shù)據(jù)文件嗎?答案是可以的,下面就是一個將DataTable中的數(shù)據(jù)寫入到XML文件中去的操作,實例代碼如下所示:
- //創(chuàng)建一個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;
- 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ù)的操作,當然也可以從XML文件中讀取數(shù)據(jù)信息到DataTable數(shù)據(jù)表中,方法累也類似,但要先建立好打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);