2012-02-29 9 views
12

SQL Serverから行を削除するときに、Asp.netのC#コードにわずかな問題があります。 ExecuteNonQueryを使用して、ページにレンダリングするメッセージを特定しています。 ExecuteNonQueryが1を返した場合、私は成功メッセージを表示します。私が立ち往生しているところでは、私はレコードを追加してレコードを更新し、コードが正常に動作するのと同じロジックを持っています。コードについては以下を参照してください。現在、影響を受けたレコードを正常に削除するとExecuteNonQueryの値が0に戻ります

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

     } 
    } 

行は、私のSQLがハードコーディングされたC#であると私は、ストアドプロシージャを使用していないので、これは、単純なSQL文で0を返します。

どのように私はこの作品を作ることができますか?

+8

あなたのコードは非常に深刻なセキュリティ上の問題であるSQLインジェクションを受けやすいです! – Yahia

+0

あなたはSQLサーバー上で直接クエリを実行しようとしましたか?それは動作しますか? – Dilberted

+0

このサイトは社内向けのものです。 –

答えて

33

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

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

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

また、あなたのコードはコメントですでに述べたように、SQLインジェクションに対して脆弱です。代わりにprepared statementsを使用することを検討してください。

+0

+1、良いキャッチとよく説明! – sll

+0

ありがとう私は間違いに気付かなかった。私はこれを正しいとマークするでしょう:( –

+0

あなたの作成ポイントと更新ポイントに同じコードを使用している場合は、それを編集する必要があります。それ以外の場合は、samレコードが挿入されます二度。 – Nzall

関連する問題