Pour capturer une VALEUR RENVOYÉE (renvoyée par SQL à l'aide de la syntaxe RETURN({nombre})), utilisez :
cmdHeader.Parameters.Add("@ReturnValue", SqlDbType.Int, 4).Direction = ParameterDirection.ReturnValue;
En outre, vous devriez probablement utiliser SCOPE_IDENTITY() au lieu de @@IDENTITY
Modifier :
Ainsi, votre sproc ferait quelque chose comme :
DECLARE @NewId INTEGER
INSERT SomeTable(FieldA) VALUES ('Something')
SELECT @NewId = SCOPE_IDENTITY()
RETURN (@NewId)
Et votre code C# pour récupérer cette valeur serait :
int newId = cmdHeader.Parameters[@ReturnValue].value;
Modification 2 :
Ok, la question d'origine a confondu le problème car la "valeur de retour" est différente de ce que vous faites réellement, c'est-à-dire renvoyer un ensemble de résultats à une seule colonne.
Donc, à la place, NE PAS ajouter un paramètre ReturnValue du tout. Utilisez simplement ExecuteScalar() en utilisant votre configuration SqlCommand d'origine comme ci-dessous :
int newId = Convert.ToInt32(cmdHeader.ExecuteScalar());