web-dev-qa-db-fra.com

ExecuteNonQuery retournant la valeur 0 lors de la suppression réussie d'un enregistrement

J'ai un léger problème dans mon code C # dans Asp.net lors de la suppression d'une ligne du serveur SQL. J'utilise ExecuteNonQuery pour déterminer le message que j'affiche sur la page. Si ExecuteNonQuery renvoie un 1, j'affiche un message de réussite. Là où je suis bloqué, j'ai la même logique pour ajouter un enregistrement et mettre à jour un enregistrement et mon code fonctionne très bien. Voir ci-dessous pour le code.

private void Delete_row(string ImageId)
    {
        string sSQL = "delete FROM dbo.Image_library_UK_temp where Image_id=" + ImageId;
        using (SqlConnection dbConnection = new SqlConnection(app_settings.sql_conn_string_db))
        {
            try
            {

                //delete the row from db
                dbConnection.Open();
                SqlCommand command = new SqlCommand(sSQL, dbConnection);
                command.CommandType = CommandType.Text;
                command.CommandTimeout = 1024;
                command.ExecuteNonQuery();

                int rowsAffected = command.ExecuteNonQuery();
                if (rowsAffected == 1)
                {

                    messagepanel1.ShowSuccessMessage("The image " + txtImgTitle.Text + "has been deleted from the system.");
                    DisableValidation();
                }

            }
            catch (Exception ex)
            {
                messagepanel1.ShowErrorMessage("Error: Deletion unsuccessful");
            }

            Session.RemoveAll();
            generateTable(false);

        }
    }

Les lignes affectées retournent actuellement 0. Il s'agit d'une simple instruction SQL, donc mon SQL est codé en dur en C # et je n'utilise pas de procédure stockée.

Des idées sur la façon dont je peux faire fonctionner cela?

13
nick gowdy

Vous exécutez la commande deux fois.

command.ExecuteNonQuery();
int rowsAffected = command.ExecuteNonQuery();

La première ligne supprimera la ligne et renverra 1, mais vous ignorez la valeur de retour. La deuxième ligne exécutera à nouveau l'instruction DELETE, mais elle ne supprimera rien, car il n'y a plus de lignes satisfaisant la condition donnée; ainsi, rowsAffected sera nul.

En outre, votre code est vulnérable aux injections SQL, comme cela a déjà été mentionné dans les commentaires. Envisagez plutôt d'utiliser instructions préparées .

37
penartur