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

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00143.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

對這文章發表回應

發表限制: 非會員 可以發表

發表者: 冷日 發表時間: 2008/3/19 7:59:47
輕鬆玩轉 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

內容圖示
url email imgsrc image code quote
樣本
bold italic underline linethrough   












 [詳情...]
validation picture

注意事項:
預覽不需輸入認證碼,僅真正發送文章時才會檢查驗證碼。
認證碼有效期10分鐘,若輸入資料超過10分鐘,請您備份內容後,重新整理本頁並貼回您的內容,再輸入驗證碼送出。

選項

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