2012-02-29 63 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); 

     } 
    } 

影響當前行,則返回0。這是一個簡單的SQL語句,所以我的SQL是硬編碼在C#中,我沒有使用存儲過程。

任何想法,我可以使這項工作?

+8

你的代碼很容易出現SQL注入,這是一個非常嚴重的安全問題! – Yahia 2012-02-29 12:20:23

+0

是否嘗試直接在sql服務器上運行查詢?它工作嗎? – Dilberted 2012-02-29 12:20:32

+0

本網站僅供內部使用,否則我會同意。 – 2012-02-29 12:26:27

回答

33

您正在執行兩次該命令。

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

第一行將刪除該行並返回1,但是您忽略了返回值。 第二行將再次執行DELETE語句,但不會刪除任何內容,因爲沒有更多行滿足給定條件;因此,rowsAffected將爲零。

此外,您的代碼容易受到SQL注入的影響,正如評論中已經提到的那樣。考慮改用prepared statements

+0

+1,很好的接收和很好的解釋! – sll 2012-02-29 12:21:28

+0

謝謝,我沒有注意到這個錯誤。在Stackoverflow允許我的時候,我會將其標記爲正確的:( – 2012-02-29 12:25:24

+0

另外,如果你使用相同的代碼來創建和更新點,那麼你需要在那裏編輯它,否則你的創建將會插入sam記錄兩次。 – Nzall 2014-09-17 12:29:34