1

我有这段代码

Dim lt As Decimal
Dim lg As Decimal
Decimal.TryParse(tbLat.Value.Replace(".", ","), lt)
Decimal.TryParse(tbLng.Value.Replace(".", ","), lg)
com.Parameters.AddWithValue("latitude", lt)
com.Parameters.AddWithValue("longtitude", lg)

我试图将ltandlg参数存储在 column 中decimal(9,6)

在本地 SQL Server 中它运行良好,但是当我部署到我的 Web 服务器时,它给了我这个错误

将数字转换为数字数据类型的算术溢出错误。该语句已终止。

我决定将精度提高到 16,因此列变为decimal(16,6). 现在它存储像 25252525.000000 这样的整数!

可能是本地化的问题,但我的问题是如何避免本地化并安全地存储数字?

4

2 回答 2

2

好的,在谷歌搜索和尝试之后,我按照http://msdn.microsoft.com/en-us/library/ew0seb73.aspx上的示例进行操作,这让我在代码中得到了驱动:

            Dim style As NumberStyles = NumberStyles.Number Or NumberStyles.AllowCurrencySymbol
            Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture("en-GB")
            Dim lt As Decimal
            Dim lg As Decimal
            If Decimal.TryParse(tbLat.Value, style, culture, lt) Then
                com.Parameters.AddWithValue("latitude", lt)
            End If
            If Decimal.TryParse(tbLng.Value, style, culture, lg) Then
                com.Parameters.AddWithValue("longtitude", lg)
            End If

它在本地和网络上都有效。感谢所有试图提供帮助的人!

于 2012-10-26T20:18:54.750 回答
0

看来您在此过程中的某个时刻丢失了小数位。

在不了解您的语言环境的情况下,我建议删除“。”的替换。使用 "," 并以默认方式解析十进制值:

Dim lt As Decimal
Dim lg As Decimal
If (Decimal.TryParse(tbLat.Value, lt)) And (Decimal.TryParse(tbLng.Value, lg)) Then
   com.Parameters.AddWithValue("latitude", lt)
   com.Parameters.AddWithValue("longtitude", lg)
Else
   'Display Error
End If

如果这不起作用,您应该进行一些调试并检查tbLat.Value, tbLng.Value, lt,lgcom.Parameterscollection 以查看转换失败的位置。

如果您使用的是 MS SQL,则可以从那里使用 SQL Server Profiler 查看传递给 SQL 的值。您应该能够看到小数位丢失的位置,并直接修复它或在此处更新您的问题。

于 2012-10-26T19:54:42.307 回答