茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1788605 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_4503.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

Dot Net? : [轉貼]輕鬆玩轉Typed DataSet

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15776
[轉貼]輕鬆玩轉Typed DataSet, Part II
輕鬆玩轉 Typed DataSet, Part II

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 批註的信息,請參見下表。默認為 _throw 。

下表顯示可為 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

前一個主題 | 下一個主題 | | | |

討論串




| Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|