Czy po połączeniu się z bazą danych mogę uzyskać nazwę wszystkich kolumn, które zostały zwrócone w mojej bazie SqlDataReader
?
c#
ado.net
sqldatareader
Blankman
źródło
źródło
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Istnieje
GetName
funkcja,SqlDataReader
która akceptuje indeks kolumny i zwraca nazwę kolumny.I odwrotnie, istnieje taki,
GetOrdinal
który pobiera nazwę kolumny i zwraca indeks kolumny.źródło
GetOrdinal
było perfekcyjne. SzukałemGetName
, ale o wiele czystszego rozwiązania mojego problemu zGetOrdinal
.Nazwy kolumn można uzyskać z czytnika danych.
Oto ważna część:
źródło
Już wspomniane. Tylko odpowiedź LINQ :
Drugi jest czystszy i znacznie szybszy. Nawet jeśli buforujesz
GetSchemaTable
w pierwszym podejściu, zapytania będą bardzo powolne.źródło
reader.Cast<IDataRecord>().ToList()
. Uważam, że możesz użyćdynamic
słowa kluczowego zamiast,IDataRecord
ale bez korzyści.DataTable
został zaprojektowany, aby ułatwić jednorazowe ładowanie, więc możesz z niego skorzystać, ale tracisz korzyści z ładowania na żądanie (z czytnikiem danych możesz zatrzymać ładowanie w dowolnym momencie), na przykładvar dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. Istnieje wiele bibliotek, które mogą zautomatyzować to za Ciebie, znajdź je tutaj stackoverflow.com/questions/11988441 i tutaj stackoverflow.com/questions/1464883reader.Cast<IEnumerable<dynamic>>
i.Cast<dynamic>
, ale mówi,Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
co zrobiłem tam źle? (Spojrzałem na twoje źródła, ale wymagały od ciebie nazwy kolumny, której nie znam)Jeśli chcesz tylko nazwy kolumn, możesz:
Ale jeśli potrzebujesz tylko jednego wiersza, podoba mi się mój dodatek AdoHelper. Ten dodatek jest świetny, jeśli masz jednowierszowe zapytanie i nie chcesz zajmować się tabelą danych w swoim kodzie. Zwraca słownik nazw i wartości kolumn bez rozróżniania wielkości liter.
źródło
throw ex;
jest najgorszą praktyką.Korzystam z metody GetSchemaTable , która jest udostępniana przez interfejs IDataReader.
źródło
Użyj metody rozszerzenia:
źródło
Na pewno możesz.
Pochodzi z: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
źródło
Łatwiej jest to osiągnąć w SQL
źródło