2012-02-29 12 views
12

Mam mały problem w moim C# kod w Asp.net podczas usuwania wiersza z serwera sql. Używam ExecuteNonQuery, aby określić, który komunikat wyświetlam na stronie. Jeśli ExecuteNonQuery zwróci wartość 1, wyświetli komunikat o pomyślnym zakończeniu. Tam, gdzie utknęłam, mam taką samą logikę dodawania rekordu i aktualizowania rekordu, a mój kod działa dobrze. Zobacz poniżej kod.ExecuteNonQuery powracający wartość 0 przy pomyślnym usunięciu rekordu

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

     } 
    } 

wierszy obecnie zwraca 0. Jest to proste stwierdzenie SQL więc mój sql jest zakodowane w języku C# i nie używam procedura przechowywana.

Jakieś pomysły, jak mogę to wykonać?

+8

Twój kod jest podatny na iniekcję SQL, która jest bardzo poważnym problemem bezpieczeństwa! – Yahia

+0

próbowałeś uruchomić kwerendę bezpośrednio na serwerze sql? Czy to działa? – Dilberted

+0

Ta strona jest dla wewnętrznych celów inaczej bym się zgodził. –

Odpowiedz

33

Wykonujesz polecenie dwa razy.

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

Pierwsza linia usunie wiersz i zwróci 1, ale ignorujesz zwracaną wartość. Druga linia ponownie wykona instrukcję DELETE, ale niczego nie usunie, ponieważ nie ma już wierszy spełniających dany warunek; tak więc, rowsAffected będzie zero.

Twój kod jest również podatny na iniekcje sql, jak już wspomniano w komentarzach. Rozważ użycie zamiast tego prepared statements.

+0

+1, dobry połów i dobrze wyjaśnione! – sll

+0

Dzięki, że nie zauważyłem tego błędu. Zaznaczę to jako poprawne, gdy pozwala mi na to Stackoverflow :( –

+0

Na marginesie, jeśli używasz tego samego kodu dla twoich punktów tworzenia i aktualizacji, musisz również go tam edytować. W przeciwnym razie twoje wstawienie wstawi rekord sam dwa razy. – Nzall

Powiązane problemy