Estrapolata da una funzione che uso io, non l'ho testata,ma dovrebbe funzionare. Gli passi un datareader aperto sulla tua query, e ti ritorna una datatable con la stessa struttura:
codice:
private DataTable GetDataTable(SqlDataReader reader)
{
DataTable table= new DataTable();
//Aggiungo tutti i campi
for(int i=0;i<reader.FieldCount;i++)
table.Columns.Add(reader.GetName(i),reader.GetFieldType(i));
//ciclo tutto il datareader
while(reader.Read())
{
//in una array di oggetti aggiungo i valori di tutti i campi
Object[] values=new object[table.Columns.Count];
for(int i=0;i<reader.FieldCount;i++)
{
values[i]=reader.GetValue(i);
}
//Aggiungo la riga al datatable
table.Rows.Add(values);
}
return table;
}
Edit: ho messo un paio di commenti