0

我的代码如下所示:

using (SqlConnection _conn = new SqlConnection(ConfigurationManager.ConnectionStrings["DarmanConnectionString"].ToString()))
{
    using (SqlCommand _cmd = new SqlCommand("dbo.sp_Noskheh_SumOfTotalPay", _conn))
    {
        _cmd.CommandType = CommandType.StoredProcedure;
        _cmd.Parameters.Add(new SqlParameter("@Co_ID", int.Parse(Session["Co_ID"].ToString())));

        _cmd.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.NVarChar));
        _cmd.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue;

        _conn.Open();
        _cmd.ExecuteNonQuery();

        Int64 result = Int64.Parse(_cmd.Parameters["@RETURN_VALUE"].Value.ToString());
        lblSumTotalPayShow.Text = result.ToString();

            _conn.Close();
        }
    }

我的SP是这样的:

create Procedure [dbo].[sp_Noskheh_SumOfTotalPay]
    @Co_ID int
As    
    -----------------
    Declare @Sum nvarchar(50)
    -----------------    
BEGIN
    Select @Sum = convert(nvarchar(50), SUM(TotalPay))
    From Noskheh
    Where (Co_ID = @Co_ID)

    Return @Sum
END

并且错误在行中(_cmd.ExecuteNonQuery();):

错误:

Sys.WebForms.PageRequestManagerServerErrorException:nvarchar 值“3955811801”的转换溢出了一个 int 列。“sp_Noskheh_SumOfTotalPay”过程试图返回 NULL 状态,这是不允许的。将改为返回状态 0。

你能帮我解决这个问题吗?

4

3 回答 3

3
  1. 将@Co_ID 更改为 bigint。3955811801 高于 2^31-1

  2. SUM 大于 2^31-1。RETURN 尝试将其转换为 int 并失败。使用 OUTPUT 参数或仅返回记录集。

像这样

create Procedure [dbo].[sp_Noskheh_SumOfTotalPay]
 @Co_ID int,
 @Sum nvarchar(50) OUTPUT --or bigint?
As

BEGIN
 Select 
  @Sum = convert(nvarchar(50), SUM(TotalPay))
 From Noskheh
  Where
  (Co_ID = @Co_ID)
END

或者

create Procedure [dbo].[sp_Noskheh_SumOfTotalPay]
 @Co_ID int
As

BEGIN
 Select 
  SUM(TotalPay) AS SumTotalPay
 From Noskheh
  Where
  (Co_ID = @Co_ID)
END
于 2010-12-20T20:14:59.110 回答
0

如果问题不是其他人指出的@Co_ID,那么可能SUM(TotalPay)等于您的 39 亿价值。如果 TotalPay 列是整数,则 SUM 在转换为 varchar 之前是整数。

于 2010-12-20T20:18:24.033 回答
0

您正在尝试将 nvarchar 值转换为int

Return语句必须是整数。

尝试改变你的方法并在你的存储过程中做

Select @Sum代替return @sum

然后而不是使用ExecuteNonQueryuseExecuteScalar

String result = (String)cmd.ExecuteScalar();
lblSumTotalPayShow.Text = result.ToString();
于 2010-12-20T20:20:16.777 回答