2013-08-29 23 views
17

OK, chciałbym wyodrębnić DataRow z DataReader. Rozglądam się od dłuższego czasu i nie wygląda na to, że jest to prosty sposób.Jak uzyskać DataRow z bieżącego wiersza obiektu DataReader?

Rozumiem, że DataReader jest bardziej zbiorem wierszy, ale odczytuje tylko jeden wiersz w tym czasie.

Moje pytanie: czy istnieje sposób na wyodrębnienie DataRow z bieżącego wiersza numeru DataReader?

+1

_ „DataReader jest bardziej zbiorem wierszy” _ nie, to bardziej jak widok na jednej płycie. 'DataReader' jest strumieniem typu" forward "do zapisów w bazie danych. Możesz tylko patrzeć na bieżący rekord. –

Odpowiedz

23

Czy istnieje sposób na wyodrębnienie DataRow z bieżącego wiersza obiektu DataReader ?

Nie, przynajmniej nie ma prostego sposobu. Każdy DataRow należy do jednego Table. Nie możesz zostawić tej właściwości pustej, nie możesz nawet zmienić tabeli (bez użycia ImportRow).

Ale jeśli potrzebujesz programu DataRows, dlaczego w pierwszej kolejności nie musisz wypełniać numeru DataTable?

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) 

Jeśli naprawdę potrzebujesz, aby wiersz (y) z DataReader można użyć reader.GetSchemaTable, aby uzyskać wszystkie informacje o kolumnach:

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

Ale to nie jest naprawdę skuteczny.

+0

Zdobędę tylko jeden wiersz na czas. Dlatego właśnie nauczyłem się, że 'DataReader' jest lepszy niż wypełnianie' DataTable', a następnie łączenie go z innymi wierszami w innym 'DataTable' –

+0

Twoja edycja wprowadza przyjemny punkt widzenia. Jakkolwiek to naprawdę nie wygląda lepiej niż wypełnianie 'DataTable' z pojedynczym wierszem, a następnie łączenie. Zaznaczę jako odpowiedź, jeśli nie odpowie dokładnie na moje pytanie. –

+1

@im_a_noob: zauważ, że przetestowałem teraz kod i zredagowałem drugi element. –

-2

To nie jest oczywiste, ale tu jest rozwiązanie, aby uzyskać z wiersza

CType(reader, IDataRecord) 

przydałby tak:

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