web-dev-qa-db-ja.com

レコードを正常に削除するとExecuteNonQueryが値0を返します

SQLサーバーから行を削除するときに、Asp.netのC#コードにわずかな問題があります。 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#でハードコーディングされており、ストアドプロシージャを使用していません。

この作品を作る方法はありますか?

13
nick gowdy

コマンドを2回実行しています。

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

最初の行は行を削除して1を返しますが、戻り値は無視しています。 2行目はDELETEステートメントを再度実行しますが、指定された条件を満たす行がもうないため、何も削除しません。したがって、rowsAffectedはゼロになります。

また、コメントで既に述べたように、コードはSQLインジェクションに対して脆弱です。代わりに 準備済みステートメント の使用を検討してください。

37
penartur