在Typed DataSet中使用Array

刚刚进入了一个C#的项目组,项目中使用Typed DataSet作为DTO,在使用IDE生成XSD文件时,我们遇到了这样一个问题:客户要求XSD的某列类型是Array,如:int[]。

Typed DataSet是与表的映射,若包含数组类型,我实在不知道DataAdapter如何完成更新操作。可是,客户的文档这样写,我们必须调查是否可以实现。

经过测试,在IDE中直接设置数据类型为int[]不可行,因为,保存成XSD文件时则变成了type="xs:int_x005B__x005D_";XSD是XML文件,特殊字符自动进行了转换,因为找不到int_x005B__x005D_类型,编译失败。

在设计SQL Server数据库时,我喜欢使用uniqueidentifier作为主键(之前喜欢使用identity),使用IDE生成XSD文件显示类型是string,可最终生成的类文件则是Guid类型。

请大家参考下面的XSD代码:
 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <xs:schema id="Dataset1" targetNamespace="http://tempuri.org/Dataset1.xsd" elementFormDefault="qualified"
 3     attributeFormDefault="qualified" xmlns="http://tempuri.org/Dataset1.xsd" xmlns:mstns="http://tempuri.org/Dataset1.xsd"
 4     xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
 5     <xs:element name="Dataset1" msdata:IsDataSet="true">
 6         <xs:complexType>
 7             <xs:choice maxOccurs="unbounded">
 8                 <xs:element name="T_GUCS_TEST">
 9                     <xs:complexType>
10                         <xs:sequence>
11                             <xs:element name="TestID" msdata:DataType="System.Guid, mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
12                                 type="xs:string" minOccurs="0" />
13                             <xs:element name="TestName" type="xs:string" minOccurs="0" />
14                             <xs:element name="Age" msdata:DataType="System.Int32[], mscorlib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
15                                 type="xs:int" minOccurs="0" />
16                         </xs:sequence>
17                     </xs:complexType>
18                 </xs:element>
19             </xs:choice>
20         </xs:complexType>
21     </xs:element>
22 </xs:schema>

其中,TestID列为uniqueidentifier,在代码中除了type属性之外,又增加了一个属性msdata:DataType,并将该值设置为System.Guid

参考该方法,我修改了Age列的类型,增加了msdata:DataType,设置为System.Int32[];编译后生成了如下代码,满足了客户的要求,我也可以下班了。
 1 public int[] Age {
 2     get {
 3         try {
 4             return ((int[])(this[this.tableT_GUCS_TEST.AgeColumn]));
 5         }
 6         catch (InvalidCastException e) {
 7             throw new StrongTypingException("値は DBNull であるため、取得できません。", e);
 8         }
 9     }
10     set {
11         this[this.tableT_GUCS_TEST.AgeColumn] = value;
12     }
13 }

注1:Typed DataSet(强类型DataSet)在IDE中以XSD文件保存,可使用xsd.exe工具生成对应的类代码(在IDE中,文件保存时自动调用了该命令)。
注2:DTO是Data Transfer Object的缩写

posted on 2006-06-22 23:26  gucs  阅读(644)  评论(0编辑  收藏  举报

导航