2011-12-12 11 views
11

fino ad ora ho sempre usato una struttura simile per ottenere i dati dal database e compilare un DataTablecomando SQL Smaltimento e chiudendo la connessione

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

Ora ho visto alcune avvertenze per l'analisi di compilazione:

TestService. cs (37): CA2000: Microsoft.Reliability: nel metodo 'TestService.GetByID (int)', l'oggetto 'table' non è disposto lungo tutti i percorsi di eccezione. Chiama System.IDisposable.Dispose sull'oggetto 'table' prima che tutti i riferimenti siano fuori portata.

TestService.cs (42): CA2000: Microsoft.Reliability: nel metodo 'TestService.GetByID (int)', chiamare System.IDisposable.Dispose sull'oggetto 'cmd' prima che tutti i riferimenti siano fuori portata.

Devo cambiare il mio codice in

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

Cosa fare con oggetto DataTable? È buona pratica inserire SqlCommand all'interno?

Grazie

Acclamazioni

+0

Sì. Il tuo codice è corretto ora. Disponi sempre la classe di implementazione IDisposable. Ma SqlDataReader è anche usa e getta? – lnu

+0

Disponi il DataTable che torni? – Kangkan

+0

Credo che il lettore sia monouso sì, e forse questo è il problema WRT che la tabella non è disposta in quanto contiene un lettore che non è stato esplicitamente chiuso, sebbene mi aspetto che sia stato chiuso implicitamente quando il cmd è stato eliminato. –

risposta

7

Si dovrebbe anche fare questo:

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

quando si carica la tabella

+0

È la prima volta che vedo questo approccio. Perché su MSDN non si parla nemmeno di qualcosa di simile? – MaiOM

+0

È un'opzione. MSDN mostra solo un caso campione (semplice).E, sì, dovresti disporre anche del datatable. – lnu

+0

Così come di solito sono le applicazioni web, quando dovrei chiamare lo smaltimento del DataTable utilizzato? Diciamo che al caricamento della pagina associo quella chiamata di metodo alla griglia e la leghiamo. Dove chiamare il metodo di smaltimento? Grazie – MaiOM

3
  • Il chiamante di questo metodo dovrebbe chiamare lo Smaltire la DataTable restituito quando è fatto di usarlo.
  • Sì, è una buona pratica inserire all'interno SqlCommand.
+2

Così come di solito sono le applicazioni web, quando dovrei chiamare la disposizione del DataTable utilizzato? Diciamo che al caricamento della pagina associo quella chiamata di metodo alla griglia e la leghiamo. Dove chiamare il metodo di smaltimento? Grazie – MaiOM

1

Per "risolvere" il problema con DataTable, è possibile modificare la funzione.

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


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

Non dicendo che questa è la soluzione ottimale, ma risolverà il reclamo.

Problemi correlati