2010-08-03 6 views
2

J'ai un SqlCommand qui exécute une procédure stockée qui contient deux paramètres de sortie entiers. Juste avant l'exécution de SqlCommand, je peux voir que les paramètres de sortie sont réglés sur les valeurs correctes. Cependant, lorsque la commande est exécutée, elle utilise une valeur NULL pour parameter1 et 0 pour parameter2 (vérifiée à l'aide de SQL Profiler). .C# - Sortie SqlParameter utilise des valeurs différentes de celles données?

Une version simplifiée du code est la suivante:

foreach (KeyValuePair<string, object> parameter in outputParameters) 
{ 
    SqlParameter param = new SqlParameter(parameter.Key, parameter.Value); 
    param.Direction = ParameterDirection.Output; 
    command.Parameters.Add(param); 
} 

command.ExecuteNonQuery(); 

Je suis confus par deux choses différentes:

1) Pourquoi pas en utilisant les valeurs des paramètres? Je peux placer un point d'arrêt juste avant command.ExecuteNonQuery() et voir que la liste command.Parameters a les paramètres de sortie définis correctement, cependant la trace du profileur SQL a différents paramètres lorsque la requête est exécutée.

2) Les deux paramètres sont des entiers et définis exactement de la même façon - Pourquoi un ensemble est-il à NULL alors que l'autre est à 0?

+1

le proc s'il vous plaît publier –

+0

stocké proc stockée est un peu long et ne devrait pas être le problème ... Il fonctionne très bien à partir de SQL Management Studio. Mon problème est que les valeurs transmises de la SQLCommand à SQLServer ne sont pas ce qu'elles disent qu'elles devraient être. – Rachel

+0

Votre problème est que nous sommes incapables de voir si vos paramètres doivent être entrée, sortie ou InputOutput. Sans voir ce que vous essayez de faire avec eux, personne ne peut fournir la bonne réponse. Ne vous inquiétez pas de rendre la question très grande. J'ai la bande passante pour le gérer. –

Répondre

3

Ils sont paramètres de sortie - à savoir la valeur est destinée à venir de la procédure stockée ... logiquement ils ne ont valeurs sur l'entrée. Si vous souhaitez que les valeurs du client soient utilisées dans la procédure stockée, elles doivent avoir une direction de InputOutput.

EDIT: En réponse à votre commentaire - Output signifie juste sortie. Input signifie juste entrée. InputOutput signifie les deux façons. Il semble que vous voulez les deux façons, alors utilisez InputOutput. Quant à savoir pourquoi l'un est nul et l'autre non ... Je ne sais pas, pour être honnête.

+0

Vous pouvez utiliser le même paramètre pour l'entrée et la sortie. Je peux exécuter la procédure sans problèmes à partir du studio de gestion SQL en utilisant des paramètres valides. La raison en est que la valeur est utilisée dans la requête, bien qu'il y ait une chance qu'elle soit modifiée et je veux que cette modification soit retournée au client. – Rachel

+2

@Rachel - Vous devrez également publier la procédure stockée. – JonH

+3

@Rachel, vous pouvez utiliser le même paramètre pour les deux, mais alors la direction est InputOutput, pas Output. –

4

Vous souhaitez modifier la direction de InputOutput (par opération d'édition) plutôt que de sortie. Lorsque vous référencez les paramètres de sortie, vous indiquez au code que les valeurs doivent revenir de la procédure stockée réelle plutôt que de votre code. Même si votre code contient une valeur, votre code ne se soucie pas de savoir quelles sont ces valeurs lorsque vous spécifiez les paramètres de sortie.

Voilà ce qu'il devrait être:

foreach (KeyValuePair<string, object> parameter in outputParameters) 
{ 
    SqlParameter param = new SqlParameter(parameter.Key, parameter.Value); 
    param.Direction = ParameterDirection.InputOutput; 
    command.Parameters.Add(param); 
} 

command.ExecuteNonQuery(); 
+0

Je ne veux pas de paramètres d'entrée, car les valeurs ne sont pas renvoyées par le serveur SQL au client. – Rachel

+1

@Rachel - Ensuite, utilisez InputOutput comme @Jon Skeet a recommandé. Mais votre message d'origine indiqué Sortie seulement et cela ne fonctionne pas comme ça. La sortie indique seulement que la valeur devrait provenir de votre couche db (sproc dans ce cas). – JonH

+0

Merci! Marquer cela comme la réponse car c'est plus clair. – Rachel

Questions connexes