【问题标题】:SQL Server not passing decimal value through to C#SQL Server 未将十进制值传递给 C#
【发布时间】:2023-03-12 15:50:01
【问题描述】:

我正在尝试调用一个将十进制值返回到我的 C# 网站的函数。当我在 SQL Server 中调用该函数时,会出现尾随十进制值。但是当它被传递到 C# 中时,后面的小数会丢失。

这是我正在调用的 SQL Server 存储过程:

declare @MonthlyTotal as decimal(10,2)
set @MonthlyTotal=(select cast((Linetotal * Subtotal) as decimal(10,2)))
return @MonthlyTotal

在我的 C# 服务器代码中,我收到了存储过程值。但它不带有尾随小数。

SqlConnection sqlConnection = new SqlConnection(Connection);

SqlCommand cmd4 = new SqlCommand();
cmd4.Connection = sqlConnection;
cmd4.CommandType = CommandType.StoredProcedure;
cmd4.CommandText = "GetTBSMonthlyTotalService";

SqlParameter JobParam = new SqlParameter("MonthlyTotal", SqlDbType.Decimal, 10);
JobParam.Precision = 10;
JobParam.Scale = 2;
JobParam.Direction = ParameterDirection.ReturnValue;

cmd4.Parameters.Add(JobParam);

try
{
    sqlConnection.Open();
}
catch (Exception err)
{
    Console.WriteLine(err.Message);
}

cmd4.ExecuteNonQuery();

double ID = Double.Parse((cmd4.Parameters[0].Value.ToString()));
sqlConnection.Close();
return ID;

【问题讨论】:

  • 您使用的是 double,decimal 应该映射到 .Net 框架中的 decimal 类型。还有它们的尾随值是什么.00?
  • 尾随值不是 00。在这种特殊情况下,它们是 .44。所以我也应该将我的 C# 值更改为Decimal?
  • @MethodMan 我正在使用 SqlParameter.Percision
  • @ChaseErnst 也许您需要重新评估这一行并使用正确的数据类型double ID = Double.Parse((cmd4.Parameters[0].Value.ToString()));
  • 存储过程的 返回值 必须始终为 INT - 并且它应该用作错误(或:无错误)指示器。如果要返回十进制值 - 使用存储过程中的 OUTPUT 参数或 SELECT 语句

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


【解决方案1】:

存储过程的返回值只能是整数类型(INT、BIGINT - 见relevant MSDN docs on RETURN),它仅用于表示成功(或失败)存储过程。

如果您需要返回任何其他值 - 包括十进制 - 您需要使用 OUTPUT 参数或选择该值作为存储过程的结果集的 SELECT 语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多