DataSet對象

 
6.6 各對象參考
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集合將會包含關聯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時會出現ConstraintException。要確定引發異常的行可查看GetErrors方法返回的行。
Clear
Clone
Compute
可以使用該方法在特定查詢規則基礎上執行對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),但可使用基於表達式的列來執行兩列的計算,接着在Count方法中使用基於該表達式的列——SUM(ItemTotal)。
Compute方法通過使用通常的Object數據類型來返回結果,因此當使用Compute方法執行計算時,用來存儲結果的數據類型可能會令您吃驚。例如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中數據屬性的區別。
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創建一個UniqueConstraint對象。類似地,給一列添加UniqueConstraint也會將該列的Unique屬性設置爲true。
如果創建一組列的唯一約束或主鍵,則每個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值,則有可能出現問題。(注意:強類型DataSet中確實存在的
DataRow row;
。。。。
string strContactName;
strContactName = (string) row["ContactName"];
要避免上面的問題,可以有2種方法:創建的數據庫和數據集的列不支持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對象中定義的規則級連其子行。
DeleteRule和UpdateRule屬性很相似,都接受Rule枚舉中的值,兩個屬性的默認值都是Cascade,表示父行的更改會自動級連到字行。
如果不希望級連,也可以將DeleteRule和UpdateRule屬性值設置爲None。還可以將它們設置爲SetDefault或SetNull。設置SetNull的話,父行被刪除或其相關聯的列的內容被改變時,子行中相關聯的列的內容則爲null。SetDefault和SetNull差不多,只不過子行中相關聯的列的內容被設置爲其默認值。
Columns
ConstraintName
ExtendedProperties
RelatedColumns
RelatedTable
Table
6.5 修改DataTable內容
6.5.1 添加新DataRow
DataTable對象有一個返回新DataRow對象的方法,該對象包含了表中每一列的信息。
DataRow row=ds.Tables[“Customers”].NewRow();
row[“CustomerID”]=”ALFKI”;
創建新的DataRow後,就可以使用它的item屬性來填充不同的列,還可以使用item屬性檢查行中列的內容。
DataTable的NewRow方法創建一個新行,但並不會將該行添加到DataTable中。通常由於剛創建的行是空行,所以在新行剛創建時您並不希望添加新行。如果列沒有默認值,該列就被設置爲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)的發生。
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)        統一的功能
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屬性的方式比創建一個UniqueConstraint容易,但在確定多列合併後的值是否唯一的時候,需要創建UniqueConstraint。
ü         Primarykey
    是UniqueConstraint的一種特殊類型,ADO.NET的DataRowCollection對象用Find方法來根據主鍵列的值查找DataTable的行。
    可以使用DataTable對象的PrimaryKey屬性設置和查看主鍵。
ü         ForeignkeyConstraint
    將外部約束添加到DataTable中。通常不必刻意去創建ForeignkeyConstraint,因爲當在DataSet的兩個DataTable對象之間創建一個DataRelation的過程時,也會創建一個ForeignkeyConstraint。
注意:在DataSet的列和表中定義的約束只能在該DataSet中有效。
6.3.3 用DataAdapter.Fill模式來檢索模式信息
驗證數據是需要時間的。許多方案都沒有對DataSet設置驗證屬性,所以除非有明確的要求,DataAdapter對象的Fill方法在創建DataTable時並不對DataColumn對象設置驗證屬性,也不會將約束添加到DataTable對象的約束集合中。
當將列添加到DataTable時,可以用兩種方法來通知DataAdapter在數據庫中檢索該模式信息:一種是通過將DataAdapter對象的MissingSchemaAction屬性設置爲AddWithKey來實現的,另一種是調用DataAdapter對象的FillSchema方法。
DataAdapter將試圖爲DataTable生成一個主鍵,這是相當糟糕的。如果表含有一個包括兩個列的主鍵而使用的查詢卻不包括這些列,DataAdapter將不再使用DataTable中的這個主鍵。
DataAdapter也將設置新DataColumn對象的AutoIncrement屬性。
6.4 編寫代碼創建DataTable對象
1)        創建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方法。前者創建一個與原DataTable結構相同,並且包含相同行的新DataTable;後者創建一個與原DataTable結構相同,但沒有包含任何行的新DataTable。
3)        爲DataTable添加列
DataColumn col=tbl.Columns.Add(”CustomerID”);
4)        指定DataColumn的數據類型
可以使用DataColumn的DataType屬性來設置或查看列將包含的數據類型。直到將數據添加到DataTable對象的Rows集合後,DataColumn對象的DataType屬性纔不是可讀寫的。
數據庫的數據類型同DataColumn的數據類型不是一一映射的。
DataColumn的DataType屬性默認爲字符串,此外,DataColumn還包含一個構造函數,可以指定數據類型和所創建的新列的名稱。同樣,重載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方法,可以添加新的主鍵、唯一鍵和外鍵約束。
用代碼創建約束有兩種方法:
第一種是直接創建一個新的約束對象並將它添加到DataTable的約束集合中。
tbl.Constraints.Add(New UniqueConstraint(…));
第二鍾方法是使用約束集合對象的Add方法創建新約束並將它添加到集合中。
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,而不用根據查詢規則和行的排序來實現。
AutoIncrement的可爲與不可爲:
*可爲:使用自動增量特性
*不可爲:將生成的自動增量值提交給DB。該值僅僅是佔位符。
*不可爲:顯示還未提交給數據庫的新行自動增量值
*可爲:將AutoIncrementSeed和AutoIncrementStep設置爲-1,這樣能確保生成的佔位符不會在數據庫中出現。即使在應用程序中顯示該值,用戶也不會誤認爲ADO.NET生成的自動增量值和數據庫生成的自動增量值相同。
8)        添加基於表達式的列
ADO.NET允許創建基於表達式的DataColumn對象。可以將DataColumn對象的Expression屬性設置爲一個表達式,而用不着在查詢中包含表達式。當查看列的內容時,ADO.NET就會計算表達式並返回結果。
tbl.Columns.Add("Quantity", typeof(int));
tbl.Columns.Add("UnitPrice", typeof(Decimal));
tbl.Columns.Add("ItemTotal", typeof(Decimal),"Quantity * UnitPrice");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章