Powiąż datagrid z datareader

Chcę być w stanie wprowadzić SQL do pola tekstowego i wyświetlić wyniki w WPF Dataagrid. Myślałem, że zacznę odSqlDataReaderi ustaw datagridItemsSource do czytnika danych:

using (var cmd = conn.CreateCommand()) {
    cmd.CommandText = sql.Text;
    sqlResults.ItemsSource = cmd.ExecuteReader();
}

ale to się nie powiedzie z następującym błędem:Invalid attempt to call FieldCount when reader is closed, co rozumiem, oznacza, że ​​zanim WPF przejdzie do czytaniaFieldCount właściwość obiektu wiersza,using blok został już zakończony.

Próbowałem więc użyć LINQ iToList, aby uzyskać coś, co przetrwałoby w pamięci:

sqlResults.ItemsSource = cmd.ExecuteReader().Cast<DbDataRecord>().ToList();

ale wyświetla tylko „FieldCount” dla każdego wiersza, który jest najwyraźniej jedyną właściwością, któraDbDataRecord ma.

Niektóre rozwiązania, które rozważałem:

Powiązanie z tabelą DataTable zamiast obiektu DataReader? Ale nie potrzebuję możliwości edycji.Wybierz każdy wiersz w strukturze danych w pamięci? Jakiej struktury danych mogę użyć? Nie mogę używać typów anonimowych, ponieważ nazwy i typy kolumn zmieniają się w zależności od instrukcji SQL. Jeśli używamList<object>, w jaki sposób datagrid będzie wiedział, aby wygenerować kolumny dla każdego obiektu na liście?Utwórz deskryptor niestandardowego typu? Wydaje się, że to przesada.

Ale uważam, że rozwiązanie powinno być bardzo proste i łatwe. Czy brakuje mi tutaj czegoś podstawowego?

questionAnswers(1)

yourAnswerToTheQuestion