2012-02-29 25 views
12

Tengo un pequeño problema en mi código C# en Asp.net cuando elimino una fila del servidor sql. Estoy usando ExecuteNonQuery para determinar qué mensaje represento en la página. Si ExecuteNonQuery devuelve un 1, entonces mostraré el mensaje de éxito. Donde me estoy estancando es que tengo la misma lógica para agregar un registro y actualizar un registro y mi código funciona bien. Vea a continuación el código.ExecuteNonQuery que devuelve el valor de 0 al eliminar con éxito un registro

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

     } 
    } 

filas afectadas actualmente devuelve 0. Esta es una sentencia SQL sencilla por lo que mi sql está codificada en C# y no estoy usando un procedimiento almacenado.

¿Alguna idea de cómo puedo hacer que esto funcione?

+8

¡Su código es propenso a la inyección de SQL, que es un problema de seguridad muy serio! – Yahia

+0

¿Intentó ejecutar la consulta directamente en el servidor SQL? ¿Funciona? – Dilberted

+0

Este sitio es para fines internos, de lo contrario, estaría de acuerdo. –

Respuesta

33

Está ejecutando el comando dos veces.

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

La primera línea eliminará la fila y devolverá 1, pero está ignorando el valor de retorno. La segunda línea ejecutará la instrucción DELETE nuevamente, pero no eliminará nada, porque no hay más filas que satisfagan la condición dada; por lo tanto, rowsAffected será cero.

Además, su código es vulnerable a las inyecciones sql, como ya se mencionó en los comentarios. Considera usar prepared statements en su lugar.

+0

+1, buena captura y bien explicada! – sll

+0

Gracias, no noté ese error. Voy a marcar esto como correcto cuando Stackoverflow me permite :( –

+0

Como un lado, si está usando el mismo código para sus puntos de creación y actualización, necesita editarlo allí también. De lo contrario, su creación insertará el registro sam dos veces. – Nzall

Cuestiones relacionadas