2012-11-15 3 views
14

Eventuali duplicati:
How can i retrieve a table from stored procedure to a datatablecome popolare un DataTable da una stored procedure

sto cercando di riempire la mia datatable. Ho creato un tmpABCD datatable ma ho bisogno di popolarlo con i valori di una stored procedure. Non sono in grado di procedere oltre.

SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString); 
sqlcon.Open(); 
SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon); 

DataTable dt = new DataTable("tmpABCD"); 

dt.Columns.Add(new DataColumn("A")); 
dt.Columns.Add(new DataColumn("B")); 
dt.Columns.Add(new DataColumn("C")); 
dt.Columns.Add(new DataColumn("D")); 
+1

Cant. Rep. Insufficiente In entrambi i casi, le risposte qui sono risultate migliori. – MikeSmithDev

risposta

41

Non è necessario aggiungere manualmente le colonne. Basta usare un DataAdapter ed è semplice come:

DataTable table = new DataTable(); 
using(var con = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString)) 
using(var cmd = new SqlCommand("usp_GetABCD", con)) 
using(var da = new SqlDataAdapter(cmd)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 
    da.Fill(table); 
} 

Si noti che anche se non c'è bisogno di aprire/chiudere la connessione. Questo sarà fatto implicitamente dal DataAdapter.

L'oggetto di connessione associato all'istruzione SELECT deve essere valido , ma non deve essere aperto. Se la connessione viene chiusa prima che Fill venga chiamato, viene aperto per recuperare i dati, quindi chiuso. Se la connessione è aperta prima che Fill venga chiamata, rimane aperta.

+3

+1 per usi fantastici – iMortalitySX

0

È possibile utilizzare un SqlDataAdapter:

SqlDataAdapter adapter = new SqlDataAdapter(); 
    SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon); 
    cmd.CommandType = CommandType.StoredProcedure; 
    adapter.SelectCommand = cmd; 
    DataTable dt = new DataTable(); 
    adapter.Fill(dt); 
+1

Devo digitare più velocemente, dov'è il caffè? – iMortalitySX

+1

Anch'io, sebbene questo codice non funzioni, l'adattatore dati dovrebbe usare cmd nel suo costruttore o dovrebbe essere impostato dopo che il comando è stato creato. Nel suo stato attuale questo adattatore dati genererà un errore, in primo luogo che ti dice che la connessione non è inizializzata, quindi, una volta risolto, che non ha alcun testo di comando per il comando select. ;] – Sean

+0

@Sean Grazie per averlo indicato. Stavo scrivendo questo dalla memoria, non ho usato ADO.net tra qualche anno :) – BFree

2

Utilizzare i SqlDataAdapter, questo semplificherebbe tutto.

//Your code to this point 
DataTable dt = new DataTable(); 

using(var cmd = new SqlCommand("usp_GetABCD", sqlcon)) 
{ 
    using(var da = new SqlDataAdapter(cmd)) 
    { 
     da.Fill(dt): 
    } 
} 

e la vostra DataTable avrà le informazioni che stai cercando, fino a quando la vostra proceedure memorizzato restituisce un set di dati (cursore).

+0

-1 per nessun blocco 'using'. "Due torti non fanno un revival". –

+0

@JohnSaunders Risolto. Si prega di rimuovere, poiché ero più interessato all'oggetto dell'adattatore dati e non all'implementazione. Si è completamente corretti anche se si utilizza '' using' per 'SqlDataAdapter' anche per – iMortalitySX

+0

, per favore, quindi rimuoverò. –

12

Utilizzare uno SqlDataAdapter invece, è molto più facile e che non è necessario definire i nomi delle colonne da soli, otterrà i nomi delle colonne dai risultati dell'interrogazione:

using (SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["DB"].ConnectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand("usp_GetABCD", sqlcon)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 

     using (SqlDataAdapter da = new SqlDataAdapter(cmd)) 
     { 
      DataTable dt = new DataTable(); 

      da.Fill(dt); 
     } 
    } 
} 
+0

+1 per la chiusura corretta. Ero troppo pigro nella mia risposta – iMortalitySX

+0

@John Saunders applausi per aver chiuso la mia parentesi, non avevo notato che =] – Sean