轻松玩转Typed DataSet, Part IV
Written by: Rickie Lee
Dec. 11, 2004
本文继续前面的Typed DataSet系列文章(轻松玩转Typed DataSet, Part 1-3),这里阐述Typed DataSet相关文件及其作用和Typed DataSet在多层企业级系统中的应用等等。
1. Typed DataSet相关文件及其作用
按照《轻松玩转Typed DataSet, Part I》中所提及的使用 Visual Studio .NET 从 XSD 架构文件创建有类型的 DataSet,一个典型的Typed DataSet包含如下3个文件,通过点击右边Solution Explorer上的Show all files可以看到:
(1)XSD
XSD文件存放定义typed DataSet Schema的XML内容,可以通过Annotation来定制typed DataSet,更详细信息请参考《轻松玩转Typed DataSet, Part II》。
(2)Class file(如CS)
Class文件创建typed DataSet,一般由VS.Net或xsd.exe命令行工具自动生成,包括继承DataSet的Typed DataSet Class信息。该class文件实际上包括一系列继承并扩展DataSet, DataRow和EventArgs的classes,因为上述继承关系,Typed DataSet仍然保留有untyped DataSet的所有特性,并没有丢失任何特性。
如在引用Typed DataSet中DataTable对象时,你既可以使用Tables集合对象,也可以直接引用对应的属性Property,代码如下所示:
AnnotationTypedDataset.Orders
AnnotationTypedDataset.Tables[“Orders”]
(3)XSX
XSX(XML Schema Extended)文件由XML Schema Designer自动生成,包含Designer界面上布局或可视化信息。
2. Typed DataSet在多层企业级系统中的应用
当在多层的企业级应用系统中采用Typed DataSet时,通常要求Typed DataSet在全部或多数tiers中可以使用。因此,一般情况下将Typed DataSet及其相关文件存放最低的层次,这样其他引用该层的项目和assemblies就可以引用Typed DataSet对象了。
Typed DataSet的用法示例:
(1) 定位Typed DataSet中的OrderDetailsRow数据行
OrdersDataSet.OrderDetailsRow oRow;
oRow = oDs.OrderDetails.FindByOrderIDProductID(
nOrderID_OrderDetail, nProductID_Original);
(2) 检测是否列Column中包含null值
if(!oDs.Orders[0].IsOrderDateNull())
{
oDs.Orders[0].SetOrderDateNull();
}
(3) 循环Orders所有数据行及其关联的Order Details记录
foreach(OrdersDataSet.OrdersRow oOrderRow in oDs.Orders)
{
Debug.WriteLine("OrderID = " + oOrderRow.OrderID);
foreach(OrdersDataSet.OrderDetailsRow oOrderDetailRow in
oOrderRow.GetOrderDetailsRows())
{
Debug.WriteLine(" — " + oOrderDetailRow.ProductName);
}
}
需要注意的是:如果后台的Database structure发生变化,则需要同步Typed DataSet的Schema信息。在这样情况下,即使采用Untyped DataSet,你也需要改变一些Client端代码。但使用Typed DataSet的好处是,编译器能够标识出用户代码中大部分需要修改的地方,因为编译器能够对Typed DataSet在编译期间进行类型安全检查,而untyped DataSet则只能在runtime期间发现错误并抛出异常。
References:
1. Rickie, 轻松玩转Typed DataSet, Part I
2. Rickie, 轻松玩转Typed DataSet, Part II
3. Rickie, 轻松玩转Typed DataSet, Part III
4. John Papa, Efficient Coding With Strongly Typed DataSets, http://msdn.microsoft.com/msdnmag/issues/04/12/DataPoints/default.aspx