我有一个将数据库调用结果导出到 CSV 文件的过程。数据类型和文件格式必须与特定格式匹配,以便文件可以上传到外部系统。这个过程已经在 ASP.NET (.NET 2.0) 网络表单上运行了大约 7 或 8 年,突然(过去 6-18 个月的某个时间)它不像以前那样工作了。可能是在客户端服务器上安装了 .NET 4.0 之后,或者可能是在其他一些框架更新(?)或 Windows 更新(?)或提供程序更新(?)之后。我们的 DLL 几年来没有变化。我想用尽可能少的黑客攻击和削减来修复这个遗留过程。
导出三种数据类型:整数、字符串和小数。问题是所有整数列现在都被导出为小数。CSV 导出库查看列的数据类型以确定正确的输出格式,因此我使用 XSD 文件在填充之前定义我的 DataSet。这是 XSD 文件的简化示例:
<?xml version="1.0" standalone="yes"?>
<xs:schema id="FDSR" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="FDSR" msdata:IsDataSet="true" msdata:Locale="en-CA">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="TBLEXPORT">
<xs:complexType>
<xs:sequence>
<xs:element name="INTCOLUMN1" type="xs:integer" minOccurs="0" />
<xs:element name="STRCOLUMN2" type="xs:string" minOccurs="0" />
<xs:element name="DBLCOLUMN3" type="xs:decimal" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
为每列定义的数据类型在数据加载后会持续存在,但现在它们会被数据加载重置。例如:
Dim ds as New DataSet
ds.ReadXmlSchema("MyFile.xsd")
' Breakpoint here:
' ds.Tables(0).Columns(0).DataType shows: {Name = "Int64" FullName = "System.Int64"}
Dim db as New DatabaseCall("my db call...")
ds = db.ReturnData()
' Breakpoint here:
' ds.Tables(0).Columns(0).DataType now shows: {Name = "Decimal" FullName = "System.Decimal"}
GenerateCSVOutput(ds)
如何在数据库调用后强制integer
列保持不变?integer
或者如何在填充数据集后更改数据类型?
此代码已为发布进行了简化,但基本上 db.ReturnData() 正在调用 Oracle 存储过程来进行一些处理并返回System.Data.OracleClient.OracleDataAdapter.Fill(dataset)
用于填充 DataSet 的数据。Oracle中没有integer
列,因此源表的列定义为NUMBER(1,0)
. 它肯定输出了正确的精度,我只是不明白为什么 DataSet 中的列类型在明确定义为整数时会突然发生变化。不幸的是,CSV 文件需要上传到外部政府系统,该系统不1.0
接受1
...