2017-09-20 2 views
1

Dans SQL Server, je peux passer une valeur IN à un paramètre de sortie de procédure stockée, le modifier, puis le relire:Ecrire au paramètre de sortie avec C#

CREATE PROCEDURE [dbo].[testSP] 
    @myOutputParam INT OUTPUT 
AS 
BEGIN 
    SELECT @myOutputParam = @myOutputParam + 1 
END 
GO 

DECLARE @x int = 1 

EXEC testSP @myOutputParam = @x OUTPUT 

PRINT @x -- prints: 2 

Cependant, quand je tente faire à partir de C#, il ne fonctionne pas:

using (SqlConnection db = new SqlConnection("...")) 
using (SqlCommand cmd = new SqlCommand("testSP", db)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    cmd.Parameters.Add("@myOutputParam", SqlDbType.Int).Value = (int)1; 
    cmd.Parameters["@myOutputParam"].Direction = ParameterDirection.Output; 

    db.Open(); 

    int rowsAffected = cmd.ExecuteNonQuery(); 
    int x = (int)cmd.Parameters["@myOutputParam"].Value; 
} 

L'affectation int x finale renvoie une erreur

La distribution spécifiée n'est pas valide

Où est-ce que je vais mal?

+1

ce qui est le résultat de 'cmd.Parameters [ "@ myOutputParam"] value' sans coulée.? – SeM

+0

@SeM Je pense que c'est un objet vide. Ce n'est pas "null" parce que la distribution échoue encore même si j'utilise 'int? x = (int?) cmd.Parameters ["@ myOutputParam"]. Valeur; ' – mulllhausen

Répondre

8

La procédure stockée attribue une valeur nulle au paramètre de sortie comme résultat du calcul car elle est spécifiée comme sortie uniquement.

La direction du paramètre réel est entrée et sortie:

cmd.Parameters["@myOutputParam"].Direction = ParameterDirection.InputOutput;