ExecuteNonQuery()ERROR - > nvarchar值'3955811801'的转换溢出了一个int列。

时间:2010-12-20 20:12:58

标签: asp.net sql-server-2008 stored-procedures executenonquery

我的代码如下所示:

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。

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

3 个答案:

答案 0 :(得分:3)

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

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

  3. 喜欢这个

    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
    

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

The Return statement must be an integer.

尝试更改您的方法并在您的存储过程中执行

Select @Sum代替return @sum

然后使用ExecuteNonQuery

而不是ExecuteScalar
String result = (String)cmd.ExecuteScalar();
lblSumTotalPayShow.Text = result.ToString();