1

我有一个将数据库调用结果导出到 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...

4

1 回答 1

1

解决方法: 克隆数据集,更改数据类型,复制数据

Dim dsExport as New DataSet
'dsExport.ReadXmlSchema("MyFile.xsd") ' Don't bother, this no longer works

Dim db as New DatabaseCall("my db call...")    
dsExport = db.ReturnData()

' Clone the structure of dsExport, while empty change the datatype(s) as required, then copy the data in
Dim dsClone As DataSet = dsExport.Clone
dsClone.Tables("tblExport").Columns("INTCOLUMN1").DataType = System.Type.GetType("System.Int32")
For Each row As DataRow In dsExport.Tables("tblExport").Rows
    dsClone.Tables("tblExport").ImportRow(row)
Next

GenerateCSVOutput(dsClone)
于 2013-01-07T21:55:53.870 回答