在.NET中读取数字格式为相反的十进制字符句点/逗号的XML

问题描述

我的VB.NET应用程序将由第三方网站生成的XML文件导入到sql Server表中。该网站(和我的计算机)使用句点字符表示小数(例如42.015),并且一切正常。但是一位欧洲用户报告说,导入的数字正乘以1000或10000。结果表明,他的计算机正在寻找逗号十进制(例如42,015),并且在看到XML输入时将其转换为42015.00。>

我正在使用DataSet.readxmlsqlBulkcopy.WritetoServer,但不确定在哪里可以告诉程序期望句点小数。我的代码如下:

    Dim ds As New DataSet
    Try
        ds.readxml(tempfile,0)
    Catch ex As XmlException
        Log($"Error reading XML: {ex.Message} with {ex.Data}")
        Exit Sub
    End Try
    Dim columnMap As New Dictionary(Of String,String) From {
        {"LOTID","InventoryID"},{"ITEMTYPE","ItemType"},{"ITEMID","ItemNum"},{"COLOR","ColorID"},{"CONDITION","Cond"},{"REMARKS","LocationName"},{"QTY","Qty"},{"DESCRIPTION","Description"},{"SUBCONDITION","Completeness"},{"SALE","discount"},{"STOCKROOM","Stockroom"},{"BULK","Bulk"},{"BUYERUSERNAME","Reserve"},{"PRICE","Price"}
    }
    Using conn = New sqlConnection(GetDBConnectionString)
        Using sbc As New sqlBulkcopy(conn)
            conn.open()
            Dosql(conn,"TruncATE TABLE dbo.Online_Inventories;")
            For Each column As DataColumn In ds.Tables("ITEM").Columns
                If columnMap.ContainsKey(column.ColumnName) Then
                      sbc.columnmappings.Add(column.ColumnName,columnMap(column.ColumnName))
                End If
            Next
            sbc.DestinationTableName = "Online_Inventories"
            sbc.WritetoServer(ds.Tables("ITEM"))
            conn.Close()
        End Using
    End Using

导入的XML如下:

   <ITEM>
      <LOTID>217770136</LOTID>
      <DATEADDED>9/20/2020 3:02:00 PM</DATEADDED>
      <CATEGORY>771</CATEGORY>
      <COLOR>0</COLOR>
      <PRICE>11.7563</PRICE>
      <QTY>1</QTY>
      <BULK>1</BULK>
      <IMAGE></IMAGE>
      <DESCRIPTION></DESCRIPTION>
      <CONDITION>U</CONDITION>
      <SUBCONDITION>I</SUBCONDITION>
      <ITEMTYPE>S</ITEMTYPE>
      <ITEMID>41110-1</ITEMID>
      <SALE>0</SALE>
      <REMARKS></REMARKS>
      <STOCKROOM>Y</STOCKROOM>
      <MYWEIGHT>0</MYWEIGHT>
      <ITEMWEIGHT>0</ITEMWEIGHT>
      <DATELASTSOLD></DATELASTSOLD>
      <BASECURRENCYCODE>USD</BASECURRENCYCODE>
   </ITEM>

因此,在此示例中,在第三行(ds.readxml)之后,ds(“ Price”)=“ 11.7563”是一个字符串 在sbc.WritetoServer行之后,dbo.Online_Inventories.Price的值为117563.0(在这种情况下实际上是错误的,因为Price是NUMERIC(9,4))

用户的家庭文化使用逗号作为小数点时,如何使.net读取小数点的句点?谢谢!

解决方法

默认线程CultureInfo基于运行计算机的设置区域性。默认的字符串解析将使用默认的CultureInfo。您可以在执行发布的代码时将线程CultureInfo更改为使用InvariantCulture(基本上是en-US)。 InvariantCulture对小数点使用句点(。)。

npm audit