“将数字输入转换为正确的TSQL类型时出错(可能的Bug)

时间:2013-09-24 01:32:50

标签: c# asp.net sql sql-server tsql

截至目前,我遇到了这种错误

  

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

  

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

时出错

这是我的代码

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();
}

当我输入123 principalamtitemweight时,它接受答案并将其视为小数,但是当我为1234输入itemweight时并123 Principalamt显示该错误,如果我删除了转化并将其更改为Convert.ToDecimal,则会显示Error converting data type Numeric to decimal如果我将其用作文本,则会显示Error converting data type varchar to decimal Decimal (38,6) }}

这是一个错误还是什么?我似乎无法找到一种方法,我尝试了很多选项,但没有一种方法可以使用

我的数据库列如下:

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

修改
这是我第一次看到一个程序接受123作为有效输入,而1234不是,我的数据库{{1}}非常大,足以容纳这个输入,这就是为什么我正在寻找答案或可以解决的已知错误这个问题,谢谢。

1 个答案:

答案 0 :(得分:0)

我建议使用Decimal.TryParse而不是Convert作为你的principalat值,然后调试并检查如何将值转换为Money列的有效Decimal。例如;

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

在尝试将结果值存储在Decimal字段中时,我不确定是否应该使用Double作为数据类型。 Double表示浮动类型数字,我认为您应该使用this answer中提到的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 
相关问题