6.6.1 DataSet對象的屬性
CaseSensitive
DataSetName
DesignMode
EnforceConstraints
ExtendedProperties
HasErrors
Locale
Namespace
Prefix
Relations
Tables
6.6.2 DataSet對象的方法
AcceptChanges:
RowState的屬性值為Added或Modified的所有行的RowState屬性將會被設置為Unchanged。這樣做也會將DataRow的當前值重置為原始值。任何標記為Deleted的DataRow對象在調用AcceptChanges時將會被刪除。
DataAdapter對象成功地提交存儲在DataRow對象中的掛起更改時,它也隱式地對該DataRow調用了AcceptChanges。
BeginInit
Clear
Clone
Copy
EndInit
GetChanges
GetXml
GetXmlSchema
HasChanges
InferXmlSchema
Merge
ReadXml
ReadXmlSchema
RejectChanges
Reset
WriteXml
WriteXmlSchema
6.6.3 DataSet對象的事件
MergeFailed
6.6.4 DataTable對象的屬性
CaseSensitive
ChildRelations
ParentRelations
ChildRelations屬性和ParentRelations屬性允許您查看當前DataTable中包含子關系或父關系的DataRelation對象。
假設您正在處理分級的Customer數據,Order數據和OrderDetails數據,并引用了一個包含Order信息的DataTable,那么ParentRelations集合將會包含關聯(lián)Order DataTable和Customer DataTable的DataRelation對象;ChildRelations將會包含涉及Order DataTable和OrderDetails DataTable的DataRelation對象。
Columns
Constraints
DataSet
DefaultView
如果您為DataTable綁定一個控件,則該控件實際綁定到DataTable的DefaultView屬性上。例如,可以用下面的代碼來應用過濾器,使得在綁定到DataTable的DataGrid中只顯示來自西班牙的客戶,DataTable仍包含所有的客戶。
tblCustomers.DefaultView.RowFilter = "Country = 'Spain'";
gridCustomers.DataSource = tblCustomers;
DesignMode
ExtendedProperties
HasErrors
Locale
MinimumCapacity
如果大概知道DataTable包含的行數,那么在將結果填充到DataTable前設置DataTable對象的MinimumCapacity屬性可以起到增強代碼性能的結果。
MinimumCapacity默認為50
Namespace
Prefix
PrimaryKey
2個作用,一個是作為唯一約束,另一個是使用DataTable的Rows集合的Find方法還可以根據DataRow中的主鍵在DataTable中定位在DataRow。
Rows
TableName
6.6.5 DataTable對象的方法
AcceptChanges
BeginInit
BeginLoadData
如果要將一組DataRow對象添加到DataTable對象中,那么使用BeginLoadData和EndLoadData方法也許能夠改進性能。
調用BeginLoadData會關閉DataTable的約束,調用EndLoadData將恢復約束。如果DataTable包含破壞約束的行,那么在調用EndLoadData時會出現(xiàn)ConstraintException。要確定引發(fā)異常的行可查看GetErrors方法返回的行。
Clear
Clone
Compute
可以使用該方法在特定查詢規(guī)則基礎上執(zhí)行對DataTable中某一列的聚合查詢。
下面代碼介紹了使用Compute方法來計算包含chai的定單數。代碼還計算訂購chai的單位總數:
string strSQL, strConn;
strConn = "Provider=SQLOLEDB;Data Source=(local)\\NetSDK;" +
"Initial Catalog=Northwind;Trusted_Connection=Yes;";
strSQL = "SELECT OrderID, ProductID, Quantity FROM [Order Details]";
OleDbDataAdapter da = new OleDbDataAdapter(strSQL, strConn);
DataTable tbl = new DataTable("Order Details");
da.Fill(tbl);
int intNumChaiOrders;
Int64 intNumChaiUnits;
intNumChaiOrders = (int) tbl.Compute("COUNT(OrderID)",
"ProductID = 1");
intNumChaiUnits = (Int64) tbl.Compute("SUM(Quantity)",
"ProductID = 1");
Console.WriteLine("# of orders that include chai: " +
intNumChaiOrders);
Console.WriteLine("Total number of units ordered: " +
intNumChaiUnits);
不能使用Compute方法來計算包括多列的聚合——如SUM(Quantity*UnitPrice),但可使用基于表達式的列來執(zhí)行兩列的計算,接著在Count方法中使用基于該表達式的列——SUM(ItemTotal)。
Compute方法通過使用通常的Object數據類型來返回結果,因此當使用Compute方法執(zhí)行計算時,用來存儲結果的數據類型可能會令您吃驚。例如Quantity列的數據類型屬性是16位的整數,但調用Compute方法返回的是64位整數。
如果不能確定調用Compute方法時存儲結果的數據類型,可以使用下面的代碼:
object objRetVal = tbl.Compute("SUM(Quantity)",
"ProductID = 1");
Console.WriteLine(objRetVal.GetType().ToString());
Copy
EndInit
EndLoadData
GetChanges
GetErrors
ImportRow
LoadDataRow
NewRow
ImportRow接受DataRow對象,并將數據添加到DataTable中。
LoadDataRow方法會接受任一數組作為它的第一個參數。數組中的每個項對應DataTable的列集合的一項。LoadDataRow的第二個參數是控制新DataRow對象的RowState的Boolean值。如果希望是Added,應該置false,如果希望是Unmodified,設置為true即可。
NewRow方法會為DataTable返回一個新DataRow對象,此時新DataRow將不會存儲在DataTable的Rows集合中,當已經將所需的列加入DataRow后,需要將這項添加到Rows集合中。
應該用哪種方法,建議如下:
如果不希望從不同DataTable中導入行,使用ImportRow方法。
如果希望根據文件內容一次添加若干行,使用LoadDataRow。
其他情況下,使用NewRow
RejectChanges
Reset
Select
可以使用select方法根據各種搜索條件來定位DataTable的一行或多行,Select方法會返回符合條件的一組DataRow對象。
6.6.6 DataTable對象的事件
ColumnChanged
ColumnChanging
RowChanged
RowChanging
RowDeleted
RowDeleting
6.6.7 DataColumn對象的屬性
AllowDBNull
AutoIncrement
AutoIncrementSeed
AutoIncrementStep
Caption
如果在綁定的數據網格中顯示DataTable的內容,可使用Caption屬性來控制列的標題。在默認情況下,Caption屬性將返回與ColumnName屬性值相同的值。
ColumnMapping
當DataSet數據以xml返回時,可以使用ColumnMapping屬性來控制ADO.NET如何寫入列的內容。
ColumnMapping屬性接受System.Data命名空間中的MappingType枚舉的值。ColumnMapping屬性默認值為Element,即表示DataRow中每一列的值都會顯示在一個元素標簽中。還可以將ColumnMapping屬性設置為Attribute、Hidder或SimpleContent。
下面的例子表明了使用元素和使用DataSet中數據屬性的區(qū)別。
Using Column.ColumnMapping = MappingType.Element
<MyDataSet>
<Customers>
<CustomerID>ABCDE</CustomerID>
<CompanyName>New Customer</CompanyName>
<ContactName>New Contact</ContactName>
<Phone>425 555-1212</Phone>
</Customers>
</MyDataSet>
Using Column.ColumnMapping = MappingType.Attribute
<MyDataSet>
<Customers CustomerID="ABCDE" CompanyName="New Customer"
ContactName="New Contact" Phone="425 555-1212" />
</MyDataSet>
ColumnName
DataType
默認設置為存儲字符串。DataType屬性接受Type屬性的值。下面代碼介紹了如何直接設置DataColumn對象的DataType屬性和調用DataColumnCollection對象的Add方法。
DataColumn col = new DataColumn("NewColumn");
col.DataType = typeof(Decimal);
DataTable tbl = new DataTable("Products");
tbl.Columns.Add("ProductID", typeof(int));
tbl.Columns.Add("ProductName", typeof(string));
tbl.Columns.Add("UnitPrice", typeof(Decimal));
DefaultValue
Expression
可以將表達式存儲在該屬性中,并且每次請求列的內容時都會計算該表達式。只要不將該屬性設置為默認空字符串,就會自動將DataColumn的ReadOnly屬性設置為true。
下面代碼介紹了如何設置DataColumn的Expression屬性來返回DataTable中兩列的乘積。
DataTable tbl = new DataTable("Order Details");
tbl.Columns.Add("OrderID", typeof(int));
tbl.Columns.Add("ProductID", typeof(int));
tbl.Columns.Add("Quantity", typeof(int));
tbl.Columns.Add("UnitPrice", typeof(Decimal));
DataColumn col = new DataColumn("ItemTotal", typeof(Decimal));
col.Expression = "Quantity * UnitPrice"
tbl.Columns.Add(col);
DataRow row = tbl.NewRow();
row["OrderID"] = 1;
row["ProductID"] = 1;
row["Quantity"] = 6;
row["UnitPrice"] = 18;
tbl.Rows.Add(row);
Console.WriteLine(row["ItemTotal"]);
ExtendedProperties
MaxLength
默認為-1。
Namespace
Ordinal
返回DataColumn在DataTable對象的列集合中的位置,該屬性只讀,并且如果DataColumn不在DataTable對象的Column集合中,返回-1。
Prefix
ReadOnly
如果設置了true,但只要是在將列內容添加到DataTable對象的rows集合前,仍然可以修改該列的內容。
Table
Unique
將該屬性設置為true將隱式地為列所在的DataTable創(chuàng)建一個UniqueConstraint對象。類似地,給一列添加UniqueConstraint也會將該列的Unique屬性設置為true。
如果創(chuàng)建一組列的唯一約束或主鍵,則每個DataColumn的屬性都不會被設置為true,因為列中的值不一定是唯一的。
6.6.8 DataRow對象的屬性
HasErrors
Item
ItemArray
RowError
RowState
Table
6.6.9 DataRow對象的方法
AcceptChanges
BeginEdit
CancelEdit
ClearErrors
Delete
實際上并不真正刪除。如果希望徹底刪除,可以先調用delete方法,然后調用AcceptChanges。
EndEdit
GetChildRows
獲得當前DataRow的子行。要使用該方法,必須提供一個DataRelation或是該DataRelation的名稱。還可以提供DataRowVersion枚舉中的值來控制獲取數據的版本。
該方法返回一組DataRow對象中的子數據。
GetColumnError
SetColumnError
GetColumnsInError
GetParentRow
GetParentRows
SetParentRow
GetParentRow和SetParentRow提供了一種簡便的方法來分別查看和設置DataRelation對象中當前行的父行。
同GetChildRows方法一樣,GetParentRow接受DataRelation名稱或對象本身。也接受DataRowVersion枚舉中的值來控制獲取數據的版本。GetParentRow方法返回一個DataRow對象。
如果當前DataRow有多個父行,可以使用GetParentRows方法訪問那些行。
調用SetParentRow可以修改關系中的父行,使用該方法只需要傳遞該行的新的父行。如果當前行的DataTable是DataSet中多個關系的字表,則必須使用允許將DataRelation對象作為第二個參數傳遞的重載方法,這樣SetParentRow方法才能知道希望引用的是哪個關系。
HasVersion
是否具有某一版本的值。(該版本是DataRowVersion枚舉中的值)
IsNull
假設您正在處理包含客戶信息的DataRow,并希望將獲取的ContactName列內容賦給一個字符串變量,如果使用下面的代碼,且ContactName列包含Null值,則有可能出現(xiàn)問題。(注意:強類型DataSet中確實存在的)
DataRow row;
。。。。
string strContactName;
strContactName = (string) row["ContactName"];
要避免上面的問題,可以有2種方法:創(chuàng)建的數據庫和數據集的列不支持null值,或在列的內容之前查看列中是否有null值。
IsNull正是為第二種方法準備的。
RejectChanges
6.6.10 UniqueConstraint對象的屬性
Columns
ConstraintName
ExtendedProperties
IsPrimaryKey
Table
6.6.11 ForeignkeyConstraint對象的屬性
AcceptRejectRule
DeleteRule
UpdateRule
這3個屬性控制父行的修改怎樣影響子行。
AcceptRejectRule接受AcceptRejectRule枚舉中的值。該屬性默認值為None,即表示如果對行調用AcceptChanges方法或RejectChanges方法,子行不會受到影響。如果設置為Cascade,該操作會根據ForeignkeyConstraint對象中定義的規(guī)則級連其子行。
DeleteRule和UpdateRule屬性很相似,都接受Rule枚舉中的值,兩個屬性的默認值都是Cascade,表示父行的更改會自動級連到字行。
如果不希望級連,也可以將DeleteRule和UpdateRule屬性值設置為None。還可以將它們設置為SetDefault或SetNull。設置SetNull的話,父行被刪除或其相關聯(lián)的列的內容被改變時,子行中相關聯(lián)的列的內容則為null。SetDefault和SetNull差不多,只不過子行中相關聯(lián)的列的內容被設置為其默認值。
Columns
ConstraintName
ExtendedProperties
RelatedColumns
RelatedTable
Table
6.5 修改DataTable內容
6.5.1 添加新DataRow
DataTable對象有一個返回新DataRow對象的方法,該對象包含了表中每一列的信息。
DataRow row=ds.Tables[“Customers”].NewRow();
row[“CustomerID”]=”ALFKI”;
創(chuàng)建新的DataRow后,就可以使用它的item屬性來填充不同的列,還可以使用item屬性檢查行中列的內容。
DataTable的NewRow方法創(chuàng)建一個新行,但并不會將該行添加到DataTable中。通常由于剛創(chuàng)建的行是空行,所以在新行剛創(chuàng)建時您并不希望添加新行。如果列沒有默認值,該列就被設置為Null。
一旦給新行所有需要的列賦值后,就可以使用DataRowCollection的Add方法來將新行添加到DataTable中。如下:
ds.Tables[“Customers”].Rows.Add(row);
DataTable對象還提供了另一種方法來將新行添加到表中:LoadDataRow方法。使用該方法,需要給第一個參數提供一組數值,數組中的數值項與表中的列相對應;AcceptChanges是LoadDataRow方法的第二個參數,它允許控制新行DataRow的RowState屬性值。下面代碼中該值為false,則新行的RowState屬性值為Added。
Object[] aValues={“ALFKI”,”alfreds Futterkiste”,”Maria Anders”,”030-0074321”};
ds.Tables["Customers"].LoadDataRow(aValues, false);
如果第二個參數的值為true,則新DaraRow的RowState值將為Unmodified,即表示該行不包含DataAdapter要提交給數據庫的掛起更改。
6.5.2 修改當前行
有3種方法可以修改當前行。
1) 使用DataRow對象的item屬性對列賦值。
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ANTON");
if (rowCustomer == null)
//Customer not found!
else {
rowCustomer["CompanyName"] = "NewCompanyName";
rowCustomer["ContactName"] = "NewContactName";
}
2) 與第一種類似,只是添加了BeginEdit 和 EndEdit 方法
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ANTON");
if (rowCustomer == null)
//Customer not found!
else {
rowCustomer.BeginEdit();
rowCustomer["CompanyName"] = "NewCompanyName";
rowCustomer["ContactName"] = "NewContactName";
rowCustomer.EndEdit();
}
使用BeginEdit 和 EndEdit 方法可以緩存對行的更改。此外,這種方式,在EndEdit前會阻止更新事件(如RowChanging, RowChanged, ColumnChanging, ColumnChanged)的發(fā)生。
3) 使用ItemArray屬性。
同Item屬性一樣,使用ItemArray屬性可以檢索或修改行的內容,不同之處就在于Item屬性一次只能處理一行,而ItemArray屬性可以返回并接受對應列的一組項目。
object[] aCustomer={"ALFKI","NewCompanyName", "NewContactName", "NewPhoneNo"};
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer.ItemArray = aCustomer;
如果希望使用ItemArray屬性,但是又不希望修改行中每一列的值,可以使用null關鍵字。
object[] aCustomer = {null, "NewCompanyName",
"NewContactName", "NewPhoneNo"};
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer.ItemArray = aCustomer;
6.5.3 處理DataRow的空值
DataRow對象有IsNull方法,可以查看列是否包含空值。同數據行對象的Item方法一樣,IsNull方法接受列的名字、列在表中的索引或DataColumn對象。
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
if (rowCustomer.IsNull("Phone"))
Console.WriteLine("It's Null");
else
Console.WriteLine("It's not Null");
希望給列賦空值時,不必使用所選編程語言中的關鍵字Null,可以使用DBNull類的value屬性。
DataRow rowCustomer;
rowCustomer = ds.Tables["Customers"].Rows.Find("ALFKI");
rowCustomer["Phone"] = DBNull.Value;
6.5.4 刪除DataRow
簡單地調用DataRow的Delete方法就可以了。刪除行并不是把它從DataTable中刪掉,而是將行標志為掛起刪除,以反映到數據庫中。
6.5.6 清除DataRow
如果一定要從DataTable中清除行而不是將它標志為掛起刪除,可以使用DataRowCollection類的Remove或RemoveAt方法。如果有對要刪除的DataRow的引用,可以用前者;如果有索引編號,用后者。
此外,DataSet類和DataTable類分別包含了Clear方法,可以使用該方法從DataSet或DataTable中清除所有的DataRow對象而保留其結構。
6.5.7 使用DataRow.RowState屬性
ADO.NET必須知道對DataRow所做修改的類型,這樣以后才能成功地將更改提交給數據庫。ADO.NET將此信息存儲在DataRow中名為RowState的屬性中,該屬性用DataRowState枚舉值通過查看屬性可以知道行是否改動和修改類型(插入、刪除或修改)。
DataRowState枚舉值包括:
Unchanged 2 不包含任何掛起更改
Detached 1 該行不是DataTable的成員
Added 4 該行已被添加到DataTable中,卻不在數據庫中
Modified 16 該行包含掛起更改
Deleted 8 該行是一個掛起刪除
6.5.8 檢查DataRow中的掛起更改
依靠RowState屬性可以瀏覽DataTable的內容并找到修改的行。
可以使用DataTable的Item屬性來查看行中列的內容,Item屬性可以接受DataRowVersion枚舉中的第二個可選參數,DataRowVersion枚舉包括:
Current 512 存儲在列中的當前值
Original 256 存儲在列中的原始值
Proposed 1024 列的建議值,只有當使用BeginEdit編輯行時有效
Default 1536 默認操作
注意:
Original值是從數據庫中取得的值,不會改變。
刪除行后無法訪問Current,但可以訪問Original
枚舉中Default表示DataRow對象的Item屬性中參數的默認值
如果不是正處于編輯行的過程中,那么調用Item并省略可選參數等價于將DataRowVersion.Current常數作為可選參數。如果是在編輯行的過程中,將得到列的Proposed值。
6. 處理DataSet對象
6.1 DataSet的特性
DataSet對象其核心為數據的集合
特性:
1) 處理脫機數據
2) 瀏覽、排序、搜索和過濾
3) 處理分級數據
4) 緩存更改
5) Xml集成
6) 統(tǒng)一的功能
6.2 使用DataSet對象
1) DataColumn對象 屬性:Name,Ordinal,DataType
2) DataRow對象 可以提供列的名稱、列在DataTable中的序數位置、DataColumn對象三種方式訪問DataRow對象中特定列的值,效率依次提高。
3) Constraint對象
6.3 校驗DataSet中的數據
6.3.1 校驗DataColumn的屬性
設置DataColumn對應屬性:
ü ReadOnly
ü AllowDBNull
ü MaxLength
ü Unique
6.3.2 DataTable對象的Constraints集合
ADO.NET中有兩個類(UniqueConstraint和ForeignkeyConstraint)可以用于DataTable中定義約束。
DataTable提供一個Constraints屬性可以用于添加、修改或查看DataTable上的約束。
ü UniqueConstraints 如果設置了DataColumn的Unique屬性為true,也就在包含該列的DataTable里定義了一個約束,同時還將UniqueConstraints添加到DataTable對象的Constraints屬性中。 設置unique屬性的方式比創(chuàng)建一個UniqueConstraint容易,但在確定多列合并后的值是否唯一的時候,需要創(chuàng)建UniqueConstraint。
ü Primarykey 是UniqueConstraint的一種特殊類型,ADO.NET的DataRowCollection對象用Find方法來根據主鍵列的值查找DataTable的行。 可以使用DataTable對象的PrimaryKey屬性設置和查看主鍵。
ü ForeignkeyConstraint 將外部約束添加到DataTable中。通常不必刻意去創(chuàng)建ForeignkeyConstraint,因為當在DataSet的兩個DataTable對象之間創(chuàng)建一個DataRelation的過程時,也會創(chuàng)建一個ForeignkeyConstraint。
注意:在DataSet的列和表中定義的約束只能在該DataSet中有效。
6.3.3 用DataAdapter.Fill模式來檢索模式信息
驗證數據是需要時間的。許多方案都沒有對DataSet設置驗證屬性,所以除非有明確的要求,DataAdapter對象的Fill方法在創(chuàng)建DataTable時并不對DataColumn對象設置驗證屬性,也不會將約束添加到DataTable對象的約束集合中。
當將列添加到DataTable時,可以用兩種方法來通知DataAdapter在數據庫中檢索該模式信息:一種是通過將DataAdapter對象的MissingSchemaAction屬性設置為AddWithKey來實現(xiàn)的,另一種是調用DataAdapter對象的FillSchema方法。
DataAdapter將試圖為DataTable生成一個主鍵,這是相當糟糕的。如果表含有一個包括兩個列的主鍵而使用的查詢卻不包括這些列,DataAdapter將不再使用DataTable中的這個主鍵。
DataAdapter也將設置新DataColumn對象的AutoIncrement屬性。
6.4 編寫代碼創(chuàng)建DataTable對象
1) 創(chuàng)建DataTable對象 DataTable tbl=new DataTable(“TableName”);
2) 將DataTable添加到DataSet對象的Tables集合 DataTable tbl=new DataTable(“TableName”); ds.Tables.Add(tbl); 或 ds.Tables.Add(“Customers”); 可以通過查看DataTable對象的DataSet屬性來確定一個DataTable是否存在于DataSet中。 DataTable對象只能存在于至多一個DataSet對象中。如果希望將DataTable添加到多個DataSet中,就必須使用copy或clone方法。前者創(chuàng)建一個與原DataTable結構相同,并且包含相同行的新DataTable;后者創(chuàng)建一個與原DataTable結構相同,但沒有包含任何行的新DataTable。
3) 為DataTable添加列 DataColumn col=tbl.Columns.Add(”CustomerID”);
4) 指定DataColumn的數據類型 可以使用DataColumn的DataType屬性來設置或查看列將包含的數據類型。直到將數據添加到DataTable對象的Rows集合后,DataColumn對象的DataType屬性才不是可讀寫的。 數據庫的數據類型同DataColumn的數據類型不是一一映射的。 DataColumn的DataType屬性默認為字符串,此外,DataColumn還包含一個構造函數,可以指定數據類型和所創(chuàng)建的新列的名稱。同樣,重載DataColumn集合對象的Add方法可以允許為新建DataTable對象和新建DataColumn對象的ColumnName和DataType屬性賦值。 DataColumn col=tbl.Columns.Add(“OrderID”,typeof(int));
5) 添加主鍵 PrimaryKey屬性包含一個DataColumn對象數組,所以不能只簡單地將列的名稱設置為主鍵。 tbl.PrimaryKey=new DataColumn[] {tbl.Columns[“OrderID”], tbl.Columns[“ProductID”]}; 注意:為DataTable設置主鍵時,ADO.NET會自動將DataColumn對象或主鍵中引用到的對象的AllowDBNull屬性設置為false。
6) 添加其他約束 DataTable的約束集合有一個重載的Add方法,可以添加新的主鍵、唯一鍵和外鍵約束。 用代碼創(chuàng)建約束有兩種方法: 第一種是直接創(chuàng)建一個新的約束對象并將它添加到DataTable的約束集合中。 tbl.Constraints.Add(New UniqueConstraint(…)); 第二鐘方法是使用約束集合對象的Add方法創(chuàng)建新約束并將它添加到集合中。 tbl.Constraints.Add(“ConstraintName”,ColumnInformation); 推薦使用第一種方法,因為容易理解。
tbl.Constraints.Add(new UniqueConstraint(tbl.Columns["CustomerID"]));
//or
tbl.Constraints.Add("UK_Customers", tbl.Columns["CustomerID"],
false);
//Add a unique key based on the OrderID and ProductID columns.
DataColumn[] cols = new DataColumn[] {tbl.Columns["OrderID"],
tbl.Columns["ProductID"]};
tbl.Constraints.Add(new UniqueConstraint(cols));
//or
tbl.Constraints.Add("UK_Order Details", cols, false);
//Add a foreign key constraint based on the OrderID column that
//requires a corresponding OrderID in the Orders table.
tbl.Constraints.Add(new ForeignKeyConstraint
(ds.Tables["Orders"].Columns["OrderID"],
tbl.Columns["OrderID"]));
//or
tbl.Constraints.Add("FK_Order Details_Orders",
ds.Tables["Orders"].Columns["OrderID"],
tbl.Columns["OrderID"]);
7) 處理自動增量列 ADO.NET通過DataColumn的3個屬性來支持自動增量列,它們是:AutoIncrement、AutoIncrementSeed和AutoIncrementStep。 將DataColumn的AutoIncrement屬性設置為true就可以為DataTable的新行生成自動增量值。 DataSet ds = new DataSet(); DataTable tbl = ds.Tables.Add("Orders"); DataColumn col = tbl.Columns.Add("OrderID", typeof(int)); col.AutoIncrement = true; col.AutoIncrementSeed = -1; col.AutoIncrementStep = -1; col.ReadOnly = true; 依靠ADO.NET的自動增量功能,可在將行添加到DataTable時讓ADO.NET對行進行計算,從而分頁顯示DataTable,而不用根據查詢規(guī)則和行的排序來實現(xiàn)。 AutoIncrement的可為與不可為: *可為:使用自動增量特性 *不可為:將生成的自動增量值提交給DB。該值僅僅是占位符。 *不可為:顯示還未提交給數據庫的新行自動增量值 *可為:將AutoIncrementSeed和AutoIncrementStep設置為-1,這樣能確保生成的占位符不會在數據庫中出現(xiàn)。即使在應用程序中顯示該值,用戶也不會誤認為ADO.NET生成的自動增量值和數據庫生成的自動增量值相同。
8) 添加基于表達式的列 ADO.NET允許創(chuàng)建基于表達式的DataColumn對象??梢詫?/span>DataColumn對象的Expression屬性設置為一個表達式,而用不著在查詢中包含表達式。當查看列的內容時,ADO.NET就會計算表達式并返回結果。 tbl.Columns.Add("Quantity", typeof(int)); tbl.Columns.Add("UnitPrice", typeof(Decimal)); tbl.Columns.Add("ItemTotal", typeof(Decimal),"Quantity * UnitPrice");
|