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#でハードコーディングされており、ストアドプロシージャを使用していません。
この作品を作る方法はありますか?
コマンドを2回実行しています。
command.ExecuteNonQuery();
int rowsAffected = command.ExecuteNonQuery();
最初の行は行を削除して1を返しますが、戻り値は無視しています。 2行目はDELETE
ステートメントを再度実行しますが、指定された条件を満たす行がもうないため、何も削除しません。したがって、rowsAffected
はゼロになります。
また、コメントで既に述べたように、コードはSQLインジェクションに対して脆弱です。代わりに 準備済みステートメント の使用を検討してください。