【问题标题】:Error Converting data type 'Numeric' to Decimal (help!)将数据类型“数字”转换为十进制时出错(帮助!)
【发布时间】:2013-09-28 03:01:19
【问题描述】:

大家好,

现在我被这个错误困住了

Error Converting data type 'Numeric' to Decimal

这是我的代码

AddManualItems AddReconItem = new AddManualItems();
        UserAccess user = new UserAccess();
        AddReconItem.BranchCode = BranchCodeTextBox.Text;
        AddReconItem.ForLoanMonth = YearDropDownList.SelectedValue + "/" + MonthDropDownList.SelectedValue;
        AddReconItem.ItemWeight = Convert.ToDecimal(WeightTextBox.Text);     
        AddReconItem.PrincipalAmount = Convert.ToDecimal(PrincipalTexAmTextBox.Text);
        AddReconItem.PawnTicket = PwnTicketTextBox.Text;
        AddReconItem.ItemStorageGroup = Convert.ToInt16(StorageNameDropDownList.SelectedValue);
        AddReconItem.ReconID = Convert.ToInt16(ReconTypeDropDownList.SelectedValue);
        user.UserID = Session["UserID"].ToString();

        string a = servs.AddItemRecon(user, AddReconItem); // this is where the error appears in debug mode

ADDitemRecon(User,AddReconItem) 里面的代码是这样的

 using (SqlConnection reportsConn = new SqlConnection(sqlConnWriter))
            {
                reportsConn.Open();
                SqlCommand AddReconItem = new SqlCommand();
                AddReconItem.Connection = reportsConn;
                AddReconItem.CommandType = CommandType.StoredProcedure;
                AddReconItem.CommandText = "Updater.usp_AddReconcileItems";
                AddReconItem.Parameters.AddWithValue("@ITEMWEIGHT", Convert.ToDecimal( items.ItemWeight));
                AddReconItem.Parameters.AddWithValue("@ITEMPRINCIPALAMT", Convert.ToDecimal(items.PrincipalAmount));
                AddReconItem.Parameters.AddWithValue("@FORLOANMONTH", Convert.ToDateTime(items.ForLoanMonth));
                AddReconItem.Parameters.AddWithValue("@STORAGEGROUPID", items.ItemStorageGroup);
                AddReconItem.Parameters.AddWithValue("@BRANCHCODE", items.BranchCode);
                AddReconItem.Parameters.AddWithValue("RECONID", items.ReconID);
                AddReconItem.Parameters.AddWithValue("@PAWNTIX",items.PawnTicket);
                AddReconItem.Parameters.AddWithValue("@CREATEDBY", user.UserID.ToString());
                AddReconItem.ExecuteNonQuery();
            }

我的 ItemWeight 属性是

 private decimal itemWeight;

    public decimal ItemWeight
    {
        get { return itemWeight; }
        set { itemWeight = value; }
    }

我打赌错误在于物品重量,因为当我输入物品重量时 12345.12 可以正常工作,但是当我输入 1234 而不是将其视为 1234.00 时,它会将其视为 1234 仅使其成为数字..

有什么帮助吗?我不知道我的转换是否错误

顺便说一下,我在数据库中的字段是

fld_ItemWeight (decimal (38,6), not null

编辑** 十进制中有任何已知的错误吗?我现在使用的是 VS 2005。

【问题讨论】:

    标签: c# asp.net tsql sql-server-2008-r2 database-connection


    【解决方案1】:

    找到答案!我的存储过程错误我的存储过程中有十进制(9,6),使其接受 3 位或更少!将其更改为(18,2)\

    【讨论】:

      【解决方案2】:

      虽然原发帖人已经找到了他的解决方案,但为了其他人的利益,我想我会发布为我造成它的原因。

      System.Data.SqlClient.SqlException : 将数据类型数字转换为十进制时出错。

      遗憾的是,该消息没有说明哪个参数有问题。因此,我将传递的所有参数都更改为 0(对于大多数 SQL 类型来说这是一个合适的值,您可能需要使用其他值),这使得错误消失了。然后我可以将它们一个一个恢复正常,并且每次都重新测试。这就是我确定哪个参数有问题的方法。

      事实证明,对于其中一个参数,我在代码中的 (C# 十进制)太大而无法放入 decimal(7,2) 存储过程参数。

      【讨论】:

      • 提醒一下,(7,2) decimal 表示 7 是整个小数的长度,其中 2 是十进制,意思是说你的整个值将只包含 5 个数字和 2 个小数位.
      【解决方案3】:

      我不知道这个问题的正确解决方案是什么,但我有一个想法。喜欢

      将您的 ItemWeight 属性 DataType 十进制更改为字符串

        decimal xxxyyy = Convert.ToDecimal(WeightTextBox.Text); 
      
          if(!xxxyyy .ToString().Contains(".00))
          {
            AddReconItem.ItemWeight=xxxyyy.ToString() +".00";
          }
          else
          {
           AddReconItem.ItemWeight=xxxyyy.ToString() ;
          }
      

      编辑:

      试试这个另一种使用方式math.Round()

      AddReconItem.ItemWeight = Convert.ToDecimal(WeightTextBox.Text);    
      AddReconItem.ItemWeight=Math.Round(AddReconItem.ItemWeight,2);
      

      【讨论】:

      • 已经尝试过,但没有运气,在 .被删除了,我不知道为什么我只是在调试模式下看到它
      • a 112345.00 转换后返回 112345,这是在数据库中传递的值,这可能是发生异常的地方
      • @DanzaiVer 将您的数据库列 DataType decimal 更改为 nvarchar 并尝试我的解决方案。
      • 如果我这样做,十进制数据类型的本质是什么?我知道它会起作用,但是如果我需要将它们全部相加,我的数据库将特别受到数据检索的影响,因为我需要先将它们转换为十进制才能对它们求和。
      • @DanzaiVer 好的,请看我更新的答案。
      【解决方案4】:

      尝试将你的值四舍五入。

      私人小数itemWeight;

      public decimal ItemWeight
      {
          get { return itemWeight; }
          set { itemWeight = Math.Round(value,yourPrecisionHere); }
      }
      

      【讨论】:

        【解决方案5】:

        将 Sql 列更改为 Decimal(18,2),在存储过程中相同,并在 ado.net 结束时采用 SqlDbType.Decimal

        【讨论】:

          【解决方案6】:

          我的问题是该列具有正确的精度和比例(16,2),但我在过程中用作参数的变量没有(14,2)。 因此,当尝试使用该过程插入类似 99999999999999 之类的内容时,我收到了错误Error convert data type numeric to numeric

          【讨论】:

            【解决方案7】:

            当你调用一个过程并且它有一个十进制数据类型的参数时,你只能传递分数。更多详情请参考Error converting data type numeric to decimal

            【讨论】:

            • 十进制 (38,6) 我有这个,根据你给出的文章,这不应该产生任何错误,分数只适用于那些声明 (2,2) 相同精度的人并且允许相同的小数位数。
            猜你喜欢
            • 1970-01-01
            • 2013-04-27
            • 2015-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-06
            • 2016-01-22
            相关资源
            最近更新 更多