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ę odSqlDataReader
i 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?