在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代码:
其中,TestID列为uniqueidentifier,在代码中除了type属性之外,又增加了一个属性msdata:DataType,并将该值设置为System.Guid。
参考该方法,我修改了Age列的类型,增加了msdata:DataType,设置为System.Int32[];编译后生成了如下代码,满足了客户的要求,我也可以下班了。
注1:Typed DataSet(强类型DataSet)在IDE中以XSD文件保存,可使用xsd.exe工具生成对应的类代码(在IDE中,文件保存时自动调用了该命令)。
注2:DTO是Data Transfer Object的缩写
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>
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 }
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的缩写