将 C# 的十进制插入 SQL 数字时出错



我使用的是SQL server 2008,有一个字段类型为numeric(7,3)的表,我想使用C#web服务将值插入其中(我知道值在小数前不超过4位,在小数后不超过3位)。因此,我的C#变量是decimal类型的(正如我在这里所读到的)。基本上看起来是这样的-

SqlParameter vsp = new SqlParameter("@VideoStartPoint", SqlDbType.Decimal);
                    vsp.Scale = 3;
                    vsp.Precision = 7;
                    vsp.Value = VideoStartPoint;

然而,我发现只有当值小于10时,它才有效。对于10及以上的任何值,我都会得到一个错误-"将数据类型numeric转换为numeric时出错"。我知道我的表没有问题,因为当我使用SQL插入它时,我对>10的值没有问题。

有什么想法吗?干杯eRez

如果VideoStartPoint是字符串,并且您的区域设置使用"."值"11.1234"将被翻译为11123.000,而不是作为千位分隔符的",",因为.NET将使用线程的区域设置值将字符串转换为十进制。这种情况可能发生在法国、意大利、希腊,我认为西班牙语也是如此。

您应该放置一个断点来检查VideoStartPoint的值,即使它是十进制的。客户端可能存在将数字字符串转换为十进制错误的问题。

编辑:为了说明,下面的代码用希腊语和美国语这两个不同的语言环境解析同一个字符串"11.450",得到两个不同数字11450和11.450

        var grNumber = decimal.Parse("123.450", CultureInfo.GetCultureInfo("el-GR"));
        var usNumber = decimal.Parse("123.450", CultureInfo.GetCultureInfo("en-US"));
        Debug.Assert(grNumber == 123450);
        Debug.Assert(usNumber == (decimal) 123.45);

以下LINQ语句返回所有使用"的区域性作为他们的千位分隔符:

        var cultures = (from culture in CultureInfo.GetCultures(CultureTypes.AllCultures)
                       where culture.NumberFormat.NumberGroupSeparator == "."
                       select culture.Name);

有92种不同的文化对应33种ISO语言(CultureInfo.TwoLetterISOLanguageName),包括西班牙、荷兰、比利时、德国等。

最新更新