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

在.NET中读取数字格式为相反十进制字符(句点/逗号)的XML,.net,vb.net,sqlbulkcopy,readxml,.net,Vb.net,Sqlbulkcopy,Readxml,我的VB.NET应用程序正在将第三方网站生成的XML文件导入SQL Server表中。网站(和我的电脑)使用句点字符表示小数(例如42.015),一切都很好。但一位欧洲用户报告说,进口的数字被乘以1000或10000倍。结果表明,他的计算机正在查找逗号十进制数(例如42015),当它看到XML输入时,会将其转换为42015.00 我使用的是DataSet.ReadXML和SqlBulkCopy.WriteToServer,我不确定在哪里可以让程序预期周期小数。我的代码如下: Dim ds

我的VB.NET应用程序正在将第三方网站生成的XML文件导入SQL Server表中。网站(和我的电脑)使用句点字符表示小数(例如42.015),一切都很好。但一位欧洲用户报告说,进口的数字被乘以1000或10000倍。结果表明,他的计算机正在查找逗号十进制数(例如42015),当它看到XML输入时,会将其转换为42015.00

我使用的是DataSet.ReadXML和SqlBulkCopy.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>

217770136
2020年9月20日下午3:02:00
771
0
11.7563
1.
1.
U
我
s
41110-1
0
Y
0
0
美元
因此在本例中,在第三行(ds.ReadXml)之后,ds(“Price”)=“11.7563”,一个字符串 在sbc.WriteToServer行之后,dbo.Online_inventures.Price的值是117563.0(在本例中实际上是一个错误,因为Price是一个数字(9,4))


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

默认的线程区域性信息基于运行机器的设置区域性。默认字符串解析将使用默认的CultureInfo。您可以在执行发布的代码时更改线程CultureInfo以使用不变量文化(基本上是en-US)。不变量区域性使用句点(.)作为小数点

Dim currentCulture As CultureInfo = Threading.Thread.CurrentThread.CurrentCulture
Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture
' ***
' insert your code here
' ***
Threading.Thread.CurrentThread.CurrentCulture = currentCulture

您是以字符串还是数字的形式读取数字字段?数据集将其作为字符串拉入,SqlBulkCopy尝试将其转换为数字以匹配表定义。请在之前尝试进行转换,将实数放入数据集中,分析它们时要考虑XML文件中的格式。使用xsd,将价格定义为Decimal。对于简单的破解,我相信您应该能够通过以下方法解决此问题:1)在代码之前存储当前线程文化信息,2)将线程文化改为不变量文化(
Threading.Thread.CurrentThread.CurrentCulture=CultureInfo.InvariantCulture
),3)编码后,将线程区域性恢复为存储值。这样,默认解析将使用不变量文化小数标记(句点)。