aspx页面获取金额decimal,录入数据库字段decimal(18,2),转换错误:执行存储过程UP_JBXX_SJXXB_ADD错误:将数据类型 numeric 转换为 numeric 时出错。-----发生在.Net SqlClient Data Provider数据库字段 WPJE decimal(18,2),大小:9;精度:18;小数位:2
   try { model.JYJE = Convert.ToDecimal(txtjyje.Text); }
   catch { model.JYJE = 0.00m; }
   
   SqlParameter[] parameters = {new SqlParameter("@WPJE", SqlDbType.Decimal,9)};
   //parameters[0].Precision = (byte)18; //这里加上这两句也不行,size值变大 20也不行
   //parameters[0].Scale = (byte)2;
   parameters[0].Value = model.WPJE;   //执行存储过程....... 这里报错
对于这个错误:调试的方法。数据库字段手动赋值,最多能输入整数位16位:9876543210123456.56;
页面录入值9876543210123456.56,程序跟踪也没有错,只是进入数据库转换错误。最后,页面输入能保存的数值是:1234567、12345667.55;整数位为7位,多了就报原先的转换错误。
实在搞不懂,数值范围C#、sql没错,为什么转换就报错。求大家们帮忙!求正解!!!

解决方案 »

  1.   

    是不是你这里SqlParameter[] parameters = {new SqlParameter("@WPJE", SqlDbType.Decimal,9)};
    把它定死了为9位,检查一下。
      

  2.   

    不知道你有没有用过decimal类型。数据库定义的类型,大小就是9,参数什么里大小改大到20也没用
      

  3.   

     decimal(2,1),有效长度为2,小数位占1位。
      

  4.   

    这个可能是因为精度问题导致的。parameters[0].Value = model.WPJE;model.WPJE的内容可能不是你想象的那样了,你最好parameters[0].Value = Math.Round(model.WPJE,2);
      

  5.   

    感谢各位的回答。
    数据库是2005 ,size 9,是不可以改的。
    参数声明和赋值一起 
    SqlParameter[] parameters ={new SqlParameter("@WPJE", SqlDbType.Decimal,20,ParameterDirection.Input,true,18,2,"WPJE",DataRowVersion.Default,model.WPJE)}
    构造函数中的size改到20,应该足够大了吧。跟踪调试,数值到参数赋值一步:parameters[0].Value = model.WPJE; 值是完全正确的。
    现在能出现的问题应该是在两个地方:1.参数"@WPJE",精度和大小的问题 2.入库,系统自动转换 3.存储过程参数接收现在发现问题所在了:接收的存储过程参数定义错误。别人写的是numeric(9,2),精度小了。所以和SqlParameter[] parameters = {new SqlParameter("@WPJE", SqlDbType.Decimal,9)};这里的9没有关系,这个是大小值,不是精度。
    为什么整数位最多只能输入7位,因为数据库接收参数定义的是numeric(9,2),有效位9位(sql中numeric 和 decimal 用法大致相同【未细区分过,讲错了请纠正】),那么整数位自然是7位,所以会报“将数据类型 numeric 转换为 numeric 时出错”
    怎么就纳闷呢,原先的理论是正确的。