Récupération des variables de sortie SQL Server en c #

J’ai une procédure stockée:

ALTER PROCEDURE [dbo].[pr_Tbl_Test_Insert] @guidid uniqueidentifier output, @sname nvarchar(50) AS -- INSERT a new row in the table. INSERT [dbo].[Tbl_Test] ( [id], [name] ) VALUES ( ISNULl(@guidid, (newid())), @sname ) 

J’ai besoin de l’ id en C # et le mettre en output en c #:

 cmd.Parameters.AddWithValue("@guidid",_id);//_id is SqlGuid cmd.Parameters.AddWithValue("@sname", "mehdi"); cmd.ExecuteNonQuery(); MessageBox.Show(_id.ToSsortingng()); 

mais messagebox affiche la valeur null !!

Comment puis-je retourner l’identifiant?

Je l’ai changé pour:

 ALTER PROCEDURE [dbo].[pr_Tbl_Test_Insert] @guidid uniqueidentifier output, @sname nvarchar(50) AS DECLARE @NewID UNIQUEIDENTIFIER SET @NewID = newid(); -- INSERT a new row in the table. INSERT [dbo].[Tbl_Test]([id], [name]) VALUES(@NewID, @sname); SET @guidid = @NewID 

et C#

 SqlParameter outparam = cmd.Parameters.Add("@guidid",SqlDbType.UniqueIdentifier); outparam.Direction = ParameterDirection.Output; cmd.Parameters.AddWithValue("@sname", "mehdi"); cmd.ExecuteNonQuery(); MessageBox.Show(_id.Value.ToSsortingng()); 

mais ça ne retourne rien

Tout d’abord, s’il s’agit d’un paramètre OUTPUT, vous ne pouvez pas utiliser .AddWithValue en C #, vous devez utiliser:

 SqlParameter outParam = cmd.Parameters.Add("@guidid", SqlDbType.Uniqueidentifier); outParam.Direction = ParameterDirection.Output; 

De plus, dans votre code T-SQL, vous devez affecter la nouvelle valeur au paramètre de sortie!

 ALTER PROCEDURE [dbo].[pr_Tbl_Test_Insert] @guidid uniqueidentifier output, @sname nvarchar(50) AS DECLARE @NewID UNIQUEIDENTIFIER SET @NewID = newid(); -- INSERT a new row in the table. INSERT [dbo].[Tbl_Test]([id], [name]) VALUES(@NewID, @sname); SET @guidid = @NewID 

Mise à jour: si vous exécutez ceci dans votre SQL Server Mgmt Studio, cela montre-t-il quelque chose ??

 DECLARE @insertedID UNIQUEIDENTIFIER EXEC dbo.pr_Tbl_Test_Insert @guidid = @insertedID OUTPUT, @sname = N'TestUser' -- nvarchar(50) SELECT @insertedID 

et dans votre C # – vous devez lire la valeur du paramètre de sortie après avoir appelé ExecuteNonQuery !

 SqlParameter outparam = cmd.Parameters.Add("@guidid",SqlDbType.UniqueIdentifier); outparam.Direction = ParameterDirection.Output; cmd.Parameters.AddWithValue("@sname", "mehdi"); cmd.ExecuteNonQuery(); Guid newlyInsertedID = new Guid(cmd.Parameters["@guidid"].Value); MessageBox.Show(newlyInsertedID.ToSsortingng()); 

Avant d’exécuter la requête, vous devez spécifier la direction du paramètre, dans ce cas, la sortie. par exemple:

 cmd.Parameters.AddWithValue("@guidid",_id);//_id is SqlGuid cmd.Parameters.AddWithValue("@sname", "mehdi"); cmd.Parameters["@guidid"].Direction = ParameterDirection.Output cmd.ExecuteNonQuery(); MessageBox.Show(cmd.Parameters["@guidid"].Value.ToSsortingng()); 

Vous devez construire un SqlParameter à l’ aide de l’un des constructeurs vous permettant de spécifier une ParameterDirection , telle que celle-ci . Vous pouvez également construire votre paramètre, puis définir la direction à l’aide de la propriété Direction .

Vérifiez ce lien sur MSDN pour plus d’informations.

Pourquoi définissez-vous la sortie @guidid uniqueidentifier en tant que paramètre de sortie? Cela signifie qu’il la remplacera une fois que vous aurez exécuté la procédure stockée. Si c’est votre intention, vous devez append une instruction après l’instruction insert pour définir le paramètre de sortie sur la valeur souhaitée. quelque chose comme ceci: select @guidid = @generatedID. Ouais, regarde le code de Marc, c’est comme ça que tu es censé le faire.

J’ai également trouvé cela très frustrant et je ne pouvais pas comprendre le problème. Bien que de nombreuses réponses soient correctes, il y avait une simple ligne qui a souvent été négligée par moi et d’autres, à savoir que la commande doit être une procédure de stockage et pas seulement un SQL avec des parameters. J’espère donc que cela aide:

  cmd.CommandType = CommandType.StoredProcedure; 

cmd.Txt devrait ressembler à ceci:

  @"my_stored_proct " 

NE PAS

  @"my_stored_proct @p1, @p2, @p3 out" 

Donc, mettre tout cela ensemble. Vous voudrez peut-être le séparer en plusieurs méthodes. et ajoutez TimeOuts, etc. Cependant, voici, selon moi, les parties critiques qui diffèrent des autres commandes sans parameters de sortie.

  using (SqlCommand cmd= new SqlCommand()) { cmd.Text= ...; cmd.CommandType = CommandType.StoredProcedure; SqlParameter outParam = cmd.Parameters.Add("@guidid", SqlDbType.Uniqueidentifier); outParam.Direction = ParameterDirection.Output; using (var connection = new SqlConnection(this.myConnectionSsortingng)) { connection.Open(); cmd.Connection = connection; try { cmd.ExecuteNonQuery(); } catch { // put your sql catches etc. here.. throw; } } var outValue = outParam.Value; //query outValue eg ToSsortingng() }