Comment puis-je savoir si SQL Server procédure stockée qui effectue une mise à jour a fonctionné?

Dites que j'ai cette procédure stockée sur laquelle je n'ai aucun contrôle (et pas d'access à la tierce partie db).

Comment savoir si cela a fonctionné?

BEGIN Update USR Set usr_psswrd = @NewPassword where usr_usrnme = @UserName and usr_psswrd = @OldPassword END 

Je sais comment get des lignes quand il y a une instruction select dans une procédure stockée et lire ces lignes mais je n'ai aucune idée comment vérifier si cette procédure stockée a fonctionné ou pas.

C'est ce que je fais jusqu'ici qui ne marche pas. La procédure stockée fonctionne parce que le mot de passe change, je ne sais pas quoi faire après coup.

 using (SqlConnection connection = new SqlConnection(connectionSsortingng)) { // Create the command and set its properties. SqlCommand command = new SqlCommand(); command.Connection = connection; command.CommandText = "USP_ChangePassword"; command.CommandType = CommandType.StoredProcedure; command.Parameters.Add("@UserName", SqlDbType.VarChar).Value = email; command.Parameters.Add("@OldPassword", SqlDbType.VarChar).Value = oldPW; command.Parameters.Add("@NewPassword", SqlDbType.VarChar).Value = newPW; try { // Open the connection and execute the reader. connection.Open(); command.ExecuteNonQuery(); SqlDataReader reader = command.ExecuteReader(); if (reader.HasRows) { success = true; } reader.Close(); } catch (SqlException ex) { System.Diagnostics.Debug.Write("SqlException Error " + ex.Number + ": " + ex.Message); } catch (InvalidOperationException ex) { System.Diagnostics.Debug.Write("Invalid Op Error: " + ex.Message); } catch (Exception ex) { System.Diagnostics.Debug.Write("Error: " + ex.Message); } finally { connection.Close(); } } 

Dans la documentation sur ExecuteNonQuery, vous pouvez find

 > Return Value > Type: System.Int32 > The number of rows affected. 

Donc vous pouvez changer votre code pour

 try { // Open the connection and execute the reader. connection.Open(); int rowsUpdated = command.ExecuteNonQuery(); if(rowsUpdated > 0) { success = true; } } 

C'est le comportement normal d' ExecuteNonQuery , mais vérifiez si votre procédure stockée contient les instructions

 SET NOCOUNT ON 

Si vous avez cette ligne, alors ExecuteNonQuery ne peut pas returnner le nombre de lignes affectées et vous obtenez toujours -1 comme valeur de return. Si vous ne pouvez pas modifier cette procédure stockée, vous avez des problèmes.

La seule solution de contournement qui vient à l'esprit est de récupérer datatables user avec une requête SELECT et de vérifier datatables insérées (une situation très inconfortable)

Si vous vérifiez le doco pour la méthode ExecuteNonQuery () , vous verrez qu'il returnne un int , en particulier:

Pour les instructions UPDATE, INSERT et DELETE, la valeur de return est le nombre de lignes affectées par la command. Lorsqu'un triggersur existe sur une table en cours d'insertion ou de mise à jour, la valeur de return inclut le nombre de lignes affectées par l'opération d'insertion ou de mise à jour et le nombre de lignes affectées par le ou les triggersurs. Pour tous les autres types d'instructions, la valeur de return est -1. Si une annulation se produit, la valeur de return est également -1.

Par conséquent, si vous exécutez l'appel de méthode et qu'il renvoie un 1 vous pouvez supposer que votre champ a bien été mis à jour. Cela signifie que vous devez également supprimer le SqlDataReader reader = command.ExecuteReader(); ligne, et append une valeur de return vérifier quelque chose comme:

 var success = command.ExecuteNonQuery() == 1; 

(C'est une façon compacte de le faire, vous pouvez le split en plusieurs lignes).