C# 将“错误转换”数字输入转换为正确的TSQL类型(可能存在错误)

C# 将“错误转换”数字输入转换为正确的TSQL类型(可能存在错误),c#,asp.net,sql,sql-server,tsql,C#,Asp.net,Sql,Sql Server,Tsql,到目前为止,我遇到了这种错误 将数据类型float转换为decimal时出错 或 将数据类型数字转换为十进制时出错 这是我的密码 using (SqlConnection reportsConn = new SqlConnection(sqlConnWriter)) { reportsConn.Open(); SqlCommand AddReconItem = new SqlCommand(); AddReconItem.C

到目前为止,我遇到了这种错误

将数据类型float转换为decimal时出错

将数据类型数字转换为十进制时出错

这是我的密码

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.Add("@varible",SqlDbType.Decimal
            AddReconItem.Parameters.AddWithValue("@ITEMWEIGHT", Math.Round(Convert.ToDouble(WeightTextBox.Text+".00"), 2));
            AddReconItem.Parameters.AddWithValue("@ITEMPRINCIPALAMT", Math.Round(Convert.ToDouble(PrincipalTexAmTextBox.Text + ".00"), 2));
            AddReconItem.Parameters.AddWithValue("@FORLOANMONTH", Convert.ToDateTime(YearDropDownList.SelectedValue + "/" + MonthDropDownList.SelectedValue));
            AddReconItem.Parameters.AddWithValue("@STORAGEGROUPID", StorageNameDropDownList.SelectedValue);
            AddReconItem.Parameters.AddWithValue("@BRANCHCODE",BranchCodeTextBox.Text);
            AddReconItem.Parameters.AddWithValue("RECONID", ReconTypeDropDownList.SelectedValue);
            AddReconItem.Parameters.AddWithValue("@PAWNTIX",PwnTicketTextBox.Text);
            AddReconItem.Parameters.AddWithValue("@CREATEDBY", Session["UserID"].ToString());
            AddReconItem.ExecuteNonQuery();
}
当我为PrincipalAt和itemweight输入123时,它接受答案并将其视为十进制,但当我为itemweight输入1234,仍然为PrincipalAt输入123时,它显示错误,如果删除转换并将其更改为Convert.ToDecimal,则会显示将数据类型Numeric转换为decimal时出错如果将其用作文本,则会显示将数据类型varchar转换为decimal时出错

这是虫子还是什么?我似乎找不到一个办法,我尝试了很多选择,但都没有奏效

我的数据库列如下:

我真的希望你能帮助我理解这种现象

编辑
这是我第一次看到一个程序接受123作为有效输入,而1234不是,我的数据库十进制38,6非常大,足以容纳这个输入,这就是为什么我要寻找答案或已知的bug来解决这个问题,谢谢。

我建议使用Decimal.TryParse,而不是将PrincipalAt值转换为Convert,然后可能会调试和检查该值如何转换为货币列的有效十进制。例如:

bool valid;
var dbl = Convert.ToDouble("1234.00");
valid = Double.TryParse("1234.00", out dbl);

var dcml = Convert.ToDecimal("1234.00");
valid = Decimal.TryParse("1234.00", out dcml);
我不确定在尝试将结果值存储在十进制字段中时是否应该使用Double作为数据类型。表示浮动类型的数字,我认为您应该为Money列使用Decimal数据类型,如中所述

对于ItemWeight,如果数据类型为小数38,6,那么不管四舍五入如何,最终都会得到6位小数。在SQL Server中尝试以下操作,并确保@ITEMPRINCIPALAMT的参数类型为DECIMAL,与下面的示例类似

DECLARE @Var decimal(38,6) = 1234.00

DECLARE @Tbl AS TABLE
(
   Test decimal(38,6)
)

INSERT INTO @Tbl (Test) Values (@Var)

SELECT * FROM @Tbl 

你能把问题仅仅局限于,比如说,货币类型吗?小心标题或标记中的术语bug或bug-这些应该保留给使用成熟的程序/库断言问题的罕见情况:@user2246674货币类型没有问题,我怀疑十进制类型有问题。@user2246674这不是罕见的情况吗?我从来没有见过inoutting 123的流程,因为它接受它,而1234不是一个被接受的输入?这篇文章没有包含足够的证据或足够的测试用例来断言.NET framework或核心库中存在缺陷的假设。我并不是说情况并非如此,只是说这还不足以在我的代码路径中开始错误:代码在哪里?存储过程在哪里?您将参数传递给存储过程,而不是直接存储到表中。如果存在任何类型的转换问题,则需要首先检查存储过程。我打赌您会发现@ItemwWeight的定义与十进制38,6有些不同,或者存储过程代码本身存在一些奇怪的转换。那个瓦查尔是从哪里来的?@ItemWeight是定义为varchar还是在将其存储到表之前将其存储到varchar变量?