生成强类型 DataSet 给定一个符合 XML 架构定义语言 XSD 标准的 XML 架构,则可使用 .NET 框架 SDK 附带的 XSD.exe 工具来生成强类型 DataSet。 以下代码显示使用该工具生成 DataSet 的语法。xsd.exe /d /l:C# XSDSchemaFileName.xsd /n:XSDSchema.Namespace
在此语法中,/d 指令指示该工具生成 DataSet,/l: 告诉该工具要使用哪种语言(例如 C# 或 Visual Basic .NET)。可选的 /n: 指令指示该工具另外为 DataSet 生成名为 XSDSchema.Namespace 的命名空间。该命令的输出为 XSDSchemaFileName.cs,它可以在 ADO.NET 应用程序中编译和使用。所生成的代码可以编译成库或模块。 以下代码显示使用 C# 编译器 (csc.exe) 将生成的代码编译成库的语法。csc.exe /t:library XSDSchemaFileName.cs /r:System.dll /r:System.Data.dll
/t: 指令指示该工具编译成库,/r: 指令指定进行编译所需的依赖库。该命令的输出为 XSDSchemaFileName.dll,它可以在使用 /r: 指令编译 ADO.NET 应用程序时传递到编译器。 以下代码显示访问向 ADO.NET 应用程序中的 XSD.exe 传递的命名空间的语法。[Visual Basic]
Imports XSDSchema.Namespace
[C#]
using XSDSchema.Namespace;
以下代码示例使用名为 CustomerDataSet 的类型化 DataSet 来加载 Northwind 数据库中客户的列表。当使用 Fill 方法加载数据后,该示例会使用类型化 CustomersRow (DataRow) 对象循环通过 Customers 表中的每个客户。它提供了对 CustomerID 列的直接访问,而不是通过 DataColumnCollection 来访问该列。[Visual Basic]
Dim custDS As CustomerDataSet= New CustomerDataSet()
Dim custCMD As SqlDataAdapter New SqlDataAdapter("SELECT * FROM Customers", _
                                                 "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind")custCMD.Fill(custDS, "Customers")Dim custRow As CustomerDataSet.CustomersRow
For Each custRow In custDS.Customers
  Console.WriteLine(custRow.CustomerID)
Next
[C#]
CustomerDataSet custDS = new CustomerDataSet();
SqlDataAdapter custCMD = new SqlDataAdapter("SELECT * FROM Customers",
                                            "Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");custCMD.Fill(custDS, "Customers");foreach(CustomerDataSet.CustomersRow custRow in custDS.Customers)
  Console.WriteLine(custRow.CustomerID);
下面是用于该示例的 XML 架构。<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="CustomerDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="CustomerDataSet" msdata:IsDataSet="true">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="Customers">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="CustomerID" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

解决方案 »

  1.   

    下面的规则概括了强制转换的使用指南: 不要允许将导致精度损失的隐式强制转换。例如,不应该有从 Double 到 Int32 的隐式强制转换,但是可以有从 Int32 到 Int64 的隐式强制转换。 
    不要从隐式强制转换引发异常,原因是开发人员很难了解到底发生了什么。 
    提供作用于整个对象的强制转换。强制转换的值应该表示整个对象,而不是对象的成员。例如,通过返回标题让 Button 强制转换为字符串是不适当的。 
    不要生成在语义上不同的值。例如,将 Time 或 TimeSpan 转换为 Int32 是适当的。Int32 仍然表示时间或持续时间。但是,将文件名字符串(如“c:\mybitmap.gif”)转换为 Bitmap 对象是没有意义的。 
    不要强制转换来自不同域的值。强制转换在值的特定域内操作。例如,数字和字符串是不同的域。使 Int32 可以强制转换为 Double 是有意义的;而让 Int32 强制转换为 String 是没有意义的,因为它们在不同的域中。