ExecuteNonQuery () ERRORE -> La conversione del valore nvarchar '3.955.811,801 mila' straripato una colonna int.

StackOverflow https://stackoverflow.com/questions/4493467

Domanda

Il mio codice è il seguente:

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();
        }
    }

il mio SP è in questo modo:

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

e l'errore è in linea (_cmd.ExecuteNonQuery ();):

Errore:

Sys.WebForms.PageRequestManagerServerErrorException: La conversione di il valore nvarchar '3955811801' traboccato una colonna int. Il Procedura 'sp_Noskheh_SumOfTotalPay' ha tentato di restituire uno stato di NULL, che non è consentito. Uno stato di 0 verrà restituito al posto.

La prego mi aiuto per capire questo problema?

È stato utile?

Soluzione

Si sta tentando di convertire un valore nvarchar ad un int

La dichiarazione Return deve essere un numero intero.

Provare a cambiare il vostro approccio e nella vostra Stored Proc fare

Select @Sum invece di return @sum

Poi, invece di utilizzare l'uso ExecuteNonQuery ExecuteScalar

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

Altri suggerimenti

  1. Cambia @Co_ID a bigint. 3955811801 è superiore quindi 2 ^ 31-1

  2. la somma è maggiore di 2 ^ 31-1. Il ritorno prova a convertirlo in int e non riesce. Utilizzare un parametri OUTPUT o semplicemente restituire un set di record.

Ti piace questa

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

o

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

BEGIN
 Select 
  SUM(TotalPay) AS SumTotalPay
 From Noskheh
  Where
  (Co_ID = @Co_ID)
END

Se il problema non è la @Co_ID come altri indicano, allora forse il SUM(TotalPay) potrebbe essere uguale al valore di 3,9 miliardi. se la colonna TotalPay è un numero intero, il SUM è intero prima della conversione in varchar.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top