標籤:c#、ado.net
8、DataTable建立資料表
DataTable表示一個記憶體內關係資料的表,可以獨立建立和使用,也可以由其他.NET架構對象使用,
最常見的情況是作為DataSet的成員使用。
DataTable對象可通過使用DataTable建構函式來建立,或者可通過將建構函式參數傳遞到DataSet
的Tables屬性的Add方法來建立。
DataTable對象可通過使用DataAdapter對象的Fill方法或FillSchema方法在DataSet內建立,或者可使用
DataSet的ReadXml、ReadXmlSchema或InferXmlSchema方法從預定義的或推斷的XML架構中建立。
將DataTable添加為一個DataSet的Tables集合的成員後,不能再將其添加至任何其他DataSet的表的集合。
//以下代碼建立DataTable對象的執行個體,並為其指定名稱"Customers"
DataTable workTable = new DataTable("Customers");
//以下代碼建立DataTable執行個體,方法是:將其添加至DataSet的Tables集合。
DataSet custDS = new DataSet();
DataTable custTable = custDS.Tables.Add("CustTable");
8.1、定義資料表的架構
表的架構或結構由列和約束表示,使用DataColumn對象以及ForeignKeyConstraint和UniqueConstraint
對象定義DataTable的架構。表中的列可以映射到資料來源中的列、包含從運算式計算所得的值、自動遞增
它們的值,或包含主索引值。
8.1.1、在表中添加列
DataTable包含了由表的Columns屬性引起的DataColumn對象的集合。這個列的集合與任何約束一起
定義表的架構或結構。
通過使用DataColumn建構函式,或者通過調用表的Columns屬性的Add方法可以在表內建立DataColumn
對象。Add方法將接受可選的ColumnName、DataType和Expression參數,並將建立新的DataColumn
作為集合的成員。
//以下代碼將4行添加到DataTable
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(Double));
如果尚為給某個列提供列名,則將該列添加至DataColumnCollection時,該列會得到從"Columns"開始
遞增的預設名稱ColumnN。
8.1.2、建立運算式列
可以為列定義運算式,讓它能夠包含同一行中其它列值或表中多行的列值計算而得的值。
//執行個體代碼
workTable.Columns.Add("Total", typeof(Double));
workTable.Columns.Add("SalesTax", typeof(Double), "Total * 0.086");
運算式可以引用其他運算式列,但循環參考(其中兩個運算式相互引用)將產生異常。
8.1.3、建立Autoincrement列
要確保列中的值唯一,可將列值設定為在表中添加新行時自動遞增。
//以下代碼建立從200開始並以3為增量進行添加的列
DataColumn workColumn = workTable.Columns.Add("CustomerID", typeof(Int32));
workColumn.AutoIncrement = true;
workColumn.AutoIncrementSeed = 200;
workColumn.AutoIncrementStep = 3;
8.1.4、定義主鍵
在將一個單獨的DataColumn標識為DataTable的PrimaryKey時,表會自動將列的AllowDBNull屬性
設定為false,並將Unique屬性設定為true。如果是多列主鍵,則只有AllowDBNull屬性自動化佈建為false。
//範例程式碼
workTable.PrimaryKey = new DataColumn[]{workTable.Columns["CustID"]};
//或採用以下代碼
DataColumn[] myColArray = new DataColumn[1];
myColArray[0] = workTable.Columns["CustID"];
workTable.PrimaryKey = myColArray;
//下面樣本將兩列定義為主鍵
workTable.PrimaryKey = new DataColumn[]{workTable.Columns["CustLName"],
workTable.Columns["CustFName"]};
//或者採用以下代碼
DataColumn[] myKey = new DataColumn[2];
myKey[0] = workTable.Columns["CustLName"];
myKey[1] = workTable.Columns["CustFName"];
workTable.PrimaryKey = myKey;
8.1.5、添加約束
ADO.NET中有兩種約束: ForeignKeyConstraint和UniqueConstraint。預設情況下,通
過將DataRelation添加至DataSet來建立兩個或多個表之間的關係時,兩種約束會自動建立。
但是也可以在建立關係時,通過指定createConstraints = false 禁用這一行為。
//外鍵
ForeignKeyConstraint可以限制並傳播對相關列的更改。根據列的ForeignKeyConstraint屬性,
並且如果DataSet的EnforceConstraints屬性是 true ,對父行執行某些特定操作將會導致異常。
例如:如果ForeignKeyConstraint的DeleteRule屬性是None,那麼在父行有子行的情況下,則無法刪除父行。
//範例程式碼
ForeignKeyConstraint custOrderFK = new ForeignKeyConstraint("CustOrderFK");
custDS.Tables["CustTable"].Columns["CustomerID"],
custDS.Tables["OrdersTable"].Columns["CustomerID"]);
custOrderFK.DeleteRule = Rule.None;
//不能刪除具有訂單的顧客
custDS.Tables["OrdersTable"].Constraints.Add(custOrderFK);
//唯一鍵
//以下代碼為DataTable的兩列建立UniqueConstraint
DataTable custTable = custDS.Tables["Customers"];
UniqueConstraint custUC = new UniqueConstraint(
new DataColumn[]{custTable.Columns["CustomerID"], custTable.Columns["CompanyName"]});
custDS.Tables["Customers"].Constraints.Add(custUC);
9、在資料表中操作資料
9.1、將資料添至表中
添加新行可以聲明一個DataRow類型的變數。調用NewRow方法,將返回新的DataRow對象。然後DataTable
會根據表的結構按DataColumnCollection的定義建立DataRow對象。
//範例程式碼
DataRow workRow = workTable.NewRow();
workRow["CustLName"] = "Smith";
workRow[1] = "Smith";
workTable.Rows.Add(workRow);
//也可以通過傳入值得數組,調用Add方法來添加新行
workTable.Rows.Add(new Object[]{1, "Smith"});
注意: 將類型化為Object值得數組傳遞到Add方法,可在表內建立新行並將其列值設定為對象數組中的值,
數組中的值會根據它們在表中出現的順序相繼與各行匹配。
//以下樣本將10行添加至建立的Customers表中
DataRow workRow;
for (int i = 0; i < 10; i++)
{
workRow = workTable.NewRow();
workRow[0] = i;
workRow[1] = "CustName" + i.ToString();
workTable.Rows.Add(workRow);
}
9.2、查看錶中資料
可以使用DataTable的Rows和Columns集合來訪問DataTable中的內容。也可以根據包括搜尋標準、排序次序
和行狀態等特定標準,使用DataTable.Select方法返回DataTable中資料的子集。此外,用主索引值搜尋特定
行時,還可使用DataRowCollection的Find方法。
DataTable對象的Select方法返回一組與指定條件匹配的DataRow對象。Select採用篩選條件運算式、
排序運算式和DataViewRowState的選擇性參數。篩選條件運算式根據DataColumn值(例如 LastName = ‘Smith‘),
排序運算式遵循用於為列排序的標準SQL約定,例如LastName ASC, FirstName ASC。
如果對DataTable的Select方法執行多次調用,可先為DataTable建立DataView來提高效能。建立DataView
會為表中的行編製索引。然後,Select方法會使用該索引,這樣將顯著縮短產生查詢結果的時間。
本文出自 “八部天龍” 部落格,請務必保留此出處http://1224517743.blog.51cto.com/2643474/1610235
C#資料庫開發讀書筆記3---DataTable及資料表條件約束的應用