我正在使用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值没有任何问题。
任何想法? 干杯, 埃雷兹
答案 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),包括西班牙,荷兰,比利时,德国等。