ExecuteNonQuery возвращает 0 при успешном удалении записи - PullRequest
13 голосов
/ 29 февраля 2012

У меня небольшая проблема в моем коде C # в Asp.net при удалении строки с сервера sql. Я использую ExecuteNonQuery, чтобы определить, какое сообщение я отображаю на странице. Если ExecuteNonQuery возвращает 1, я отображаю сообщение об успехе. Когда я застреваю, у меня та же логика добавления записи и обновления записи, и мой код работает нормально. Ниже приведен код.

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);

        }
    }

Строки, затронутые в настоящее время, возвращают 0. Это простая инструкция SQL, поэтому мой sql жестко задан в C #, и я не использую хранимую процедуру.

Любые идеи, как я могу сделать эту работу?

1 Ответ

37 голосов
/ 29 февраля 2012

Вы выполняете команду дважды.

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

Первая строка удалит строку и вернет 1, но вы игнорируете возвращаемое значение. Вторая строка снова выполнит оператор DELETE, но ничего не удалит, потому что больше нет строк, удовлетворяющих данному условию; таким образом, rowsAffected будет нулем.

Кроме того, ваш код уязвим для SQL-инъекций, как уже упоминалось в комментариях. Попробуйте вместо этого использовать подготовленные операторы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...