對這文章發表回應
發表限制: 非會員 可以發表
Written by: Rickie Lee
Dec. 08, 2004
本文繼續前面《 輕鬆玩轉 Typed DataSet, Part I 》,這裡演練如何通過批註( Annotations )來定製類型化 DataSet ,並調用定製的 Typed DataSet 。
三、通過批註( Annotations )來定製類型化 DataSet
批註使您能夠在不修改基礎架構的情況下修改類型化 DataSet 中元素的名稱。如果修改基礎架構中元素的名稱,則會使類型化
DataSet 引用不存在於數據源中的對象,並且會丟失對存在於數據源中的對象的引用。
利用批註,您可以使用更有意義的名稱來自定義類型化 DataSet 中對象的名稱,從而使代碼更易於閱讀,類型化 DataSet 更易於為客戶端使用,同時保持基礎架構不變。
將 VS.Net IDE 默認的 DataSet 窗口切換到 XML 窗口。
1. 默認創建的 VS.Net IDE 自動生成的 Orders table 的架構元素
上述 XML Schema 會生成 OrdersRow 這一對象名稱 OrderDataSet.OrdersRow ,還有一個名為 Orders 的 DataRowCollection Class (
OrderDataSet.Orders )。
通過批註架構並標識 DataRow 和 DataRowCollection 對象的新名稱,使上述對象名稱更有意義。
首先需要在 schema header 中增加 namespace 引用,允許定製元素屬性,如下所示:
< xs:schema id ="AnnotationTypedDataset" targetNamespace ="http://tempuri.org/AnnotationTypedDataset.xsd"
elementFormDefault ="qualified" attributeFormDefault ="qualified" xmlns
="http://tempuri.org/AnnotationTypedDataset.xsd"
xmlns : mstns ="http://tempuri.org/AnnotationTypedDataset.xsd" xmlns : xs ="http://www.w3.org/2001/XMLSchema"
xmlns : msdata ="urn:schemas-microsoft-com:xml-msdata" xmlns : codegen ="urn:schemas-microsoft-com:xml-msprop" >
下面是上一架構的批註版本:
將 Order 的值指定為 typedName 將生成 DataRow 對象名稱 Order 。將 Orders 的值指定為 typedPlural 則會保留 DataRowCollection 名稱 Orders 。
下表顯示可用的批註 (From MSDN):
批註 | 說明 |
typedName | 對象的名稱。 |
typedPlural | 對象集合的名稱。 |
typedParent | 對像在父關係中被引用時的名稱。 |
typedChildren | 用於從子關係中返回對象的方法的名稱。 |
nullValue | 如果基礎值為 DBNull |
下表顯示可為 nullValue 批註指定的值 ( FROM MSDN ) :
nullValue | 說明 |
替換值 | 指定要返回的值。所返回的值必須匹配該元素的類型。例如,使用 nullValue="0" 可為空整數字段返回 0 。 |
_throw | 引發異常。這是默認值。 |
_null | 如果遇到基元類型,則返回空引用或引發異常。 |
_empty | 對於字符串返回 String.Empty ;否則,返回從空構造函數創建的對象。如果遇到基元類型,則引發異常。 |
下面是 OrderDetails 架構的批註版本:
通過
typedParent 和 typedChildren 屬性更改 Order/OrderDetails 對象的引用方法:
< xs:keyref name ="OrdertoOrderDetails" refer ="AnnotationTypedDatasetKey1" codegen:typedParent="Order" codegen:typedChildren="GetOrderDetails">
< xs:selector xpath =".//mstns:OrderDetails" />
< xs:field xpath ="mstns:OrderID" />
xs:keyref
>
這樣 Order 對象就產生一個 GetOrderDetails() 方法,沿著 Relationship 向下導航到 OrderDetail 對象, OrderDetails 對象生成一個 Order() 方法,沿著 Relationship 向上導航到 Order 對象。
四、調用定製的 Typed DataSet
如下是調用上述通過 Annotation 定製的 Typed DataSet , Code snippet 如下所示:
AnnotationTypedDataset theOrderDS = new AnnotationTypedDataset();
string strSelectOrders = "Select * From Orders ";
strSelectOrders += "Select * From [Order Details]";
SqlHelper.FillDataset(connStr, CommandType.Text, strSelectOrders, theOrderDS, new string[] {"Orders", "OrderDetails"});
StringBuilder strResults = new StringBuilder();
foreach( AnnotationTypedDataset.Order theOrder in theOrderDS.Orders )
{
strResults.Append(theOrder.OrderID.ToString() + " "
+ theOrder.CustomerID.ToString() + " "
+ theOrder.EmployeeID.ToString() + Environment.NewLine);
strResults.Append("Order Details: ");
strResults.Append(theOrder.GetChildRows("OrdertoOrderDetails").Length.ToString() + " ");
strResults.Append(theOrder. GetOrderDetails ().Length.ToString());
strResults.Append(Environment.NewLine);
}
txtResults.Text = strResults.ToString();
代碼比較簡單,上述代碼調用了 SqlHelper Class ( Microsoft Data Access Application Block )的 FillDataset 方法,來完成 DataSet 的填充。與調用默認的 Typed DataSet 代碼相比較有細微差別。
Any questions or errors, please leave comments below. Thanks.
References:
1. MSDN
2. Rickie, 輕鬆玩轉 Typed DataSet, Part I