2013-08-29 17 views
17

Ok, vorrei estrarre uno DataRow uno DataReader. Sono stato in giro da un po 'di tempo e non sembra che ci sia un modo semplice per farlo.Come ottenere un DataRow fuori dalla riga corrente di un DataReader?

Capisco che uno DataReader è più un insieme di righe ma legge solo una riga alla volta.

Quindi la mia domanda: esiste un modo per estrarre un DataRow dalla riga corrente di un DataReader?

+1

_ "Un DataReader è più un insieme di righe" _ no, è più come una vista su un singolo disco. Un 'DataReader' è un flusso forward-only per i record nel database. Puoi solo guardare il record corrente. –

risposta

23

Esiste un modo per estrarre un DataRow dalla riga corrente di un DataReader ?

No, almeno non in modo semplice. Ogni DataRow appartiene a uno Table. Non puoi lasciare quella proprietà vuota, non puoi nemmeno cambiare la tabella (senza usare ImportRow).

Ma se avete bisogno di DataRows, perché non riempite uno DataTable in primo luogo?

DataTable table = new DataTable(); 
using(var con = new SqlConnection("....")) 
using(var da = new SqlDataAdapter("SELECT ... WHERE...", con)) 
    da.Fill(table); 
// now you have the row(s) 

Se si ha realmente bisogno per ottenere la riga (s) dal DataReader è possibile utilizzare reader.GetSchemaTable per ottenere tutte le informazioni sulle colonne:

if (reader.HasRows) 
{ 
    DataTable schemaTable = reader.GetSchemaTable(); 
    DataTable data = new DataTable(); 
    foreach (DataRow row in schemaTable.Rows) 
    { 
     string colName = row.Field<string>("ColumnName"); 
     Type t = row.Field<Type>("DataType"); 
     data.Columns.Add(colName, t); 
    } 
    while (reader.Read()) 
    { 
     var newRow = data.Rows.Add(); 
     foreach (DataColumn col in data.Columns) 
     { 
      newRow[col.ColumnName] = reader[col.ColumnName]; 
     } 
    } 
} 

ma che non è realmente efficace.

+0

Riceverò solo una riga alla volta. Ecco perché ho pensato a un 'DataReader' era meglio che compilare un' DataTable', quindi unirlo con altre righe in un altro 'DataTable' –

+0

La tua modifica offre un bel punto di vista. In ogni caso, non sembra davvero migliore del riempimento di un 'DataTable' con una singola riga e della fusione successiva. Contrassegnerò come evento di risposta se non risponde esattamente alla mia domanda. –

+1

@im_a_noob: notare che ho testato il codice ora e modificato il secondo pezzo. –

-2

Non è ovvio, ma qui è la soluzione per ottenere solo la riga

CType(reader, IDataRecord) 

potrebbe usare in questo modo:

While reader.Read() 
    CType(reader, IDataRecord) 
End While 
Problemi correlati