ExecuteNonQuery () ERROR -> Преобразование значения nvarchar '3955811801' переполнило столбец int. - PullRequest
0 голосов
/ 20 декабря 2010

Мой код как показано ниже:

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 ]

3 голосов
/ 20 декабря 2010
  1. Измените @Co_ID на bigint. 3955811801 выше, чем 2 ^ 31-1

  2. Сумма превышает 2 ^ 31-1. Возврат пытается преобразовать его в 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
0 голосов
/ 20 декабря 2010

Вы пытаетесь преобразовать значение nvarchar в int

Оператор Return должен быть целым числом.

Попробуйте изменить свой подход и вваш сохраненный процесс сделать

Select @Sum вместо return @sum

Затем вместо ExecuteNonQuery используйте ExecuteScalar

String result = (String)cmd.ExecuteScalar();
lblSumTotalPayShow.Text = result.ToString();
0 голосов
/ 20 декабря 2010

Если проблема не в @Co_ID, как указывают другие, то, возможно, SUM(TotalPay) может быть равно вашему 3,9 млрд. Значений. если столбец TotalPay является целым числом, SUM является целым числом до преобразования в varchar.

...