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列が整数の場合、varcharに変換する前のSUMは整数です。

于 2010-12-20T20:18:24.033 に答える
0

nvarchar値をに変換しようとしていますint

ステートメントはReturn整数でなければなりません。

アプローチを変更してみてください。ストアドプロシージャで

Select @Sumそれ以外のreturn @sum

ExecuteNonQuery次に、使用する代わりにExecuteScalar

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