Могу ли я получить имя всех столбцов, которые были возвращены в моем после подключения к базе данных SqlDataReader
?
c#
ado.net
sqldatareader
Бланкмэн
источник
источник
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Существует
GetName
функция,SqlDataReader
которая принимает индекс столбца и возвращает имя столбца.И наоборот, есть,
GetOrdinal
который принимает имя столбца и возвращает индекс столбца.источник
GetOrdinal
было прекрасно. Я искалGetName
, но гораздо более чистое решение для моей проблемы сGetOrdinal
.Вы можете получить имена столбцов из DataReader.
Вот важная часть:
источник
Уже упоминалось. Просто ответ LINQ :
Второй чище и намного быстрее. Даже если вы кешируете
GetSchemaTable
при первом подходе, запросы будут очень медленными.источник
reader.Cast<IDataRecord>().ToList()
. Я считаю, что вы могли бы использоватьdynamic
ключевое слово там,IDataRecord
но без пользы.DataTable
был разработан, чтобы облегчить однократную загрузку, так что вы можете использовать это тоже, но вы теряете преимущество загрузки по требованию (с помощью считывателя данных вы можете прекратить загрузку в любой момент), напримерvar dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. Есть много библиотек, которые могут автоматизировать это для вас, найдите их здесь stackoverflow.com/questions/11988441 и здесь stackoverflow.com/questions/1464883reader.Cast<IEnumerable<dynamic>>
и.Cast<dynamic>
, но там написано,Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
что я там не так сделал? (Я посмотрел на ваши источники, но они потребовали, чтобы вы знали имя столбца, а я нет)Если вы хотите только имена столбцов, вы можете сделать:
Но если вам нужен только один ряд, мне нравится мое дополнение AdoHelper. Это дополнение хорошо, если у вас есть однострочный запрос, и вы не хотите иметь дело с таблицей данных в своем коде. Он возвращает нечувствительный к регистру словарь имен и значений столбцов.
источник
throw ex;
это худшая практика.Я использую метод GetSchemaTable , который предоставляется через интерфейс IDataReader.
источник
Используйте метод расширения:
источник
Вы уверены, что можете.
Это родом из: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
источник
Этого проще добиться в SQL
источник