1

データベース呼び出しの結果をCSVファイルにエクスポートするプロセスがあります。ファイルを外部システムにアップロードできるように、データ型とファイル形式は特定の形式と一致する必要があります。このプロセスは、ASP.NET(.NET 2.0)Webフォームで7〜8年間実行されていましたが、突然(過去6〜18か月の間に)以前のように機能しなくなりました。おそらく、.NET 4.0がクライアントサーバーにインストールされた後、または他のフレームワークの更新(?)またはWindows Update(?)またはプロバイダーの更新(?)の後です。私たちのDLLはここ数年変更されていません。このレガシープロセスを、可能な限り最小限のハッキングとスラッシュで修正したいと思います。

エクスポートされるデータ型には、整数、文字列、および10進数の3つがあります。問題は、すべての整数列が現在小数としてエクスポートされていることです。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にデータを入力するために使用してデータを返します。integerOracleには列がないため、ソーステーブルの列は。として定義されていNUMBER(1,0)ます。間違いなく正しい精度を出力しています。整数として明示的に定義されているときに、DataSetの列タイプが突然変更される理由がわかりません。1.0残念ながら、CSVファイルは、1...を受け入れない外部の政府システムにアップロードする必要があります。

4

1 に答える 1

1

回避策: DataSetのクローンを作成し、データタイプを変更し、データをコピーします

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 に答える