2011-12-12 21 views
11

hasta ahora Siempre he utilizado una estructura similar para obtener datos de base de datos y rellenar un DataTableEliminación de comandos SQL y cerrar la conexión

public static DataTable GetByID(int testID) 
     { 
     DataTable table = new DataTable(); 
     string query = @"SELECT * FROM tbl_Test AS T WHERE T.testID = @testID"; 

     using (SqlConnection cn = new SqlConnection(Configuration.DefaultConnectionString)) 
     { 
      SqlCommand cmd = new SqlCommand(query, cn); 
      cmd.Parameters.Add("@testID", SqlDbType.Int).Value = testID; 

      cn.Open(); 
      table.Load(cmd.ExecuteReader()); 
     } 

     return table; 
    } 

Ahora vi algunas advertencias en el análisis de la acumulación:

TestService. cs (37): CA2000: Microsoft.Reliability: en el método 'TestService.GetByID (int)', el objeto 'table' no se elimina a lo largo de todas las rutas de excepción. Call System.IDisposable.Dispose en object 'table' antes de que todas las referencias estén fuera del alcance.

TestService.cs (42): CA2000: Microsoft.Reliability: En el método 'TestService.GetByID (int)', llame a System.IDisposable.Dispose en el objeto 'cmd' antes de que todas las referencias estén fuera del alcance.

¿Debo cambiar mi código en

public static DataTable GetByID(int testID) 
    { 
     DataTable table = new DataTable(); 
     string query = @"SELECT * FROM tbl_Test AS T WHERE T.testID = @testID"; 

     using (SqlConnection cn = new SqlConnection(Configuration.DefaultConnectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand(query, cn)) 
      { 
       cmd.Parameters.Add("@testID", SqlDbType.Int).Value = testID; 

       cn.Open(); 
       table.Load(cmd.ExecuteReader()); 
      } 
     } 

     return table; 
    } 

¿Qué hacer con objeto DataTable? ¿Es una buena práctica colocar SqlCommand dentro del uso?

Gracias

Saludos

+0

Sí. Tu código es correcto ahora Siempre descarte la clase que implementa IDisposable. Pero, ¿SqlDataReader también es desechable? – lnu

+0

¿Desecha la DataTable que devuelve? – Kangkan

+0

Creo que el lector es desechable, sí, y quizás ése sea el problema de que WRT no esté dispuesta, ya que contiene un lector que no ha sido explícitamente cerrado, aunque espero que se haya cerrado implícitamente cuando se haya dispuesto el cmd. –

Respuesta

7

También debe hacer esto:

using (SqlDataReader reader = 
      cmd.ExecuteReader 
       (CommandBehavior.CloseConnection)) 
     { 
      table.Load(reader); 
     } 

al cargar la tabla

+0

Es la primera vez que veo este enfoque. ¿Por qué en MSDN nada similar incluso se menciona? – MaiOM

+0

Es una opción. MSDN muestra solo un caso de muestra (simple).Y, sí, debería disponer de la tabla de datos también. – lnu

+0

Bueno, ya que generalmente son aplicaciones web, ¿cuándo debo llamar a la disposición del DataTable utilizado? Digamos que en la carga de la página asocio esa llamada de método a la grilla y la enlazo. ¿Dónde llamar al método de eliminación? Gracias – MaiOM

3
  • El que llama a este método debe llamar al disponer de la DataTable devuelto cuando se hace uso de ella.
  • Sí, es una buena práctica colocar SqlCommand dentro utilizando.
+2

Bueno, ya que generalmente son aplicaciones web, ¿cuándo debo llamar a la eliminación de DataTable? Digamos que en la carga de la página asocio esa llamada de método a la grilla y la enlazo. ¿Dónde llamar al método de eliminación? Gracias – MaiOM

1

Para "arreglar" su problema con DataTable, quizás podría modificar su función.

public static void GetByID(DataTable table, int testID) 
{ 
    // bla bla bla 
} 


// calling the function 
using(DataTable table = new DataTable()) 
{ 
    TestService.GetByID(table, 5); 
} 

No diciendo que esta es la solución óptima, pero resolverá la queja.

Cuestiones relacionadas