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

时间:2012-02-09 09:33:56

标签: c# sql sql-server-2008 sqldatatypes

我正在使用SQL Server 2008,并且有一个字段类型为numeric(7,3)的表,我希望使用C#web-service插入值(我知道值不会超过小数点前4位,后面3位数)。因此我的C#变量是十进制类型(因为我读here)。 它基本上看起来像这样 -

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

然而,我发现它只有 如果值小于10.对于10以上的任何值我都会收到错误 - “将数据类型数字转换为数字时出错”。 我知道我的表没有问题,因为当我使用SQL插入它时,我对> 10值没有任何问题。

任何想法? 干杯, 埃雷兹

1 个答案:

答案 0 :(得分:1)

如果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);

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