Chiamata alla stored procedure con valore di ritorno

Sto cercando di chiamare una stored procedure dalla mia applicazione Windows C #. La stored procedure è in esecuzione su un’istanza locale di SQL Server 2008. Sono in grado di chiamare la stored procedure ma non riesco a recuperare il valore dalla stored procedure. Questa stored procedure dovrebbe restituire il numero successivo nella sequenza. Ho fatto ricerche online e tutti i siti che ho visto hanno indicato che questa soluzione funzionava.

Codice di procedura memorizzato:

ALTER procedure [dbo].[usp_GetNewSeqVal] @SeqName nvarchar(255) as begin declare @NewSeqVal int set NOCOUNT ON update AllSequences set @NewSeqVal = CurrVal = CurrVal+Incr where SeqName = @SeqName if @@rowcount = 0 begin print 'Sequence does not exist' return end return @NewSeqVal end 

Codice che chiama la stored procedure:

 SqlConnection conn = new SqlConnection(getConnectionString()); conn.Open(); SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn); cmd.CommandType = CommandType.StoredProcedure; SqlParameter param = new SqlParameter(); param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar); param.Direction = ParameterDirection.Input; param.Value = "SeqName"; SqlDataReader reader = cmd.ExecuteReader(); 

Ho anche provato a utilizzare un DataSet per recuperare il valore restituito con lo stesso risultato. Cosa mi manca per ottenere il valore restituito dalla procedura memorizzata? Se sono necessarie ulteriori informazioni, per favore fatemelo sapere.

È necessario aggiungere il parametro di ritorno al comando:

 using (SqlConnection conn = new SqlConnection(getConnectionString())) using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = parameterStatement.getQuery(); cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.AddWithValue("SeqName", "SeqNameValue"); var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int); returnParameter.Direction = ParameterDirection.ReturnValue; conn.Open(); cmd.ExecuteNonQuery(); var result = returnParameter.Value; } 

So che questo è vecchio, ma mi sono imbattuto in esso con Google.

Se hai un valore di ritorno nella stored procedure, pronuncia “Ritorno 1” – non usando i parametri di output.

È ansible eseguire le seguenti operazioni: “@RETURN_VALUE” viene aggiunto automaticamente a ogni object comando. NESSUN BISOGNO DI AGGIUNGERE ESPLICITAMENTE

  cmd.ExecuteNonQuery(); rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value; 

ExecuteScalar () funzionerà, ma un parametro di output sarebbe una soluzione superiore.

La versione di EnterpriseLibrary sulla mia macchina aveva altri parametri. Questo stava funzionando:

  SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int); retval.Direction = System.Data.ParameterDirection.ReturnValue; cmd.Parameters.Add(retval); db.ExecuteNonQuery(cmd); object o = cmd.Parameters["@ReturnValue"].Value; 

Puoi provare a utilizzare un parametro di output. http://msdn.microsoft.com/en-us/library/ms378108.aspx

Ho avuto un problema simile con la chiamata SP restituendo un errore che un parametro previsto non è stato incluso. Il mio codice era il seguente.
Procedura memorizzata:

@Result int OUTPUT

E C#:

  SqlParameter result = cmd.Parameters.Add(new SqlParameter("@Result", DbType.Int32)); result.Direction = ParameterDirection.ReturnValue; 

Nella risoluzione dei problemi, mi sono reso conto che la stored procedure stava effettivamente cercando una direzione di “InputOutput”, quindi la seguente modifica risolveva il problema.

  r 

Result.Direction = ParameterDirection.InputOutput;

O se stai usando EnterpriseLibrary piuttosto che ADO.NET standard …

 Database db = DatabaseFactory.CreateDatabase(); using (DbCommand cmd = db.GetStoredProcCommand("usp_GetNewSeqVal")) { db.AddInParameter(cmd, "SeqName", DbType.String, "SeqNameValue"); db.AddParameter(cmd, "RetVal", DbType.Int32, ParameterDirection.ReturnValue, null, DataRowVersion.Default, null); db.ExecuteNonQuery(cmd); var result = (int)cmd.Parameters["RetVal"].Value; } 

Vedo che l’altro è chiuso. Quindi fondamentalmente qui è il ruvido del mio codice. Penso che manchi il commento della stringa cmd. Ad esempio se la procedura del mio negozio è chiamata: DBO.Test. Avrei bisogno di scrivere cmd = “DBO.test”. Quindi esegui il comando di tipo uguale alla procedura di archiviazione e blah blah blah

 Connection.open(); String cmd="DBO.test"; //the command Sqlcommand mycommand;