【问题标题】:"Error converting" numeric input to correct TSQL type (possible Bug)“错误转换”数字输入到正确的 TSQL 类型(可能的错误)
【发布时间】:2013-09-24 01:32:49
【问题描述】:

目前我遇到了这种错误

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

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

这是我的代码

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 for principalamtitemweight 它接受答案并将其视为小数,但是当我输入 1234 for itemweight 并且仍然 123 for Principalamt 它时显示该错误,如果我删除转换并将其更改为Convert.ToDecimal,它会显示Error converting data type Numeric to decimal,如果我将其用作文本,则会显示Error converting data type varchar to decimal

这是一个错误还是什么?我似乎无法找到一种方法,我尝试了很多选项,但它们都没有奏效

我的数据库列如下:

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

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

【问题讨论】:

  • 您能否将问题隔离为只是,比如金钱类型? (注意标题或标签中的术语“错误”或“错误” - 这些应该保留用于断言与完善的程序/库存在问题的极少数情况:)
  • @user2246674 货币类型没有问题,我怀疑是小数类型的问题。
  • @user2246674 这不是罕见的情况吗?我从未见过输入 123 的流程,因为它接受它,而 1234 不是接受的输入?
  • 这篇文章没有包含足够的证据或足够的测试用例来断言 .NET 框架或核心库中存在错误的假设。我并不是说事实并非如此,而只是说这不足以开始探索“错误”(在非我的代码中)路线:)
  • 代码在哪里?存储过程在哪里?您将参数传递给存储过程,而不是将它们直接存储到表中。如果有任何类型的转换问题,您需要先检查存储过程。我敢打赌,您会发现 @ItemwWeight 的定义与 decimal(38,6) 有所不同,或者存储过程代码本身存在一些奇怪的转换。例如。 varchar 是从哪里来的? @ItemWeight 是定义为 varchar 还是在将其存储到表之前将其存储到 varchar 变量?

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


【解决方案1】:

我建议使用 Decimal.TryParse 而不是 Convert 作为您的 principalamt 值,然后可能调试和检查该值如何转换为您的 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 代表浮点类型数字,我认为您应该为您的 Money 列使用 Decimal 数据类型,如 this answer 中所述。

对于 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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-11
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多