Após conectar-me ao banco de dados, posso obter o nome de todas as colunas retornadas na minha SqlDataReader
?
c#
ado.net
sqldatareader
Blankman
fonte
fonte
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Existe uma
GetName
função noSqlDataReader
qual aceita o índice da coluna e retorna o nome da coluna.Por outro lado, existe um
GetOrdinal
que recebe um nome de coluna e retorna o índice da coluna.fonte
GetOrdinal
foi perfeito. Eu estava procurandoGetName
, mas uma solução muito mais limpa para o meu problemaGetOrdinal
.Você pode obter os nomes das colunas de um DataReader.
Aqui está a parte importante:
fonte
Já mencionado. Apenas uma resposta LINQ :
O segundo é mais limpo e muito mais rápido. Mesmo se você fizer cache
GetSchemaTable
na primeira abordagem, a consulta será muito lenta.fonte
reader.Cast<IDataRecord>().ToList()
. Acredito que você poderia usar adynamic
palavra-chave lá em vez de,IDataRecord
mas sem nenhum benefício.DataTable
foi projetado para facilitar o carregamento único, para que você possa usá-lo também, mas perde o benefício de carregar sob demanda (com o leitor de dados, você pode parar de carregar a qualquer momento)var dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. Existem muitas bibliotecas que podem automatizar isso para você, encontre-as aqui stackoverflow.com/questions/11988441 e aqui stackoverflow.com/questions/1464883reader.Cast<IEnumerable<dynamic>>
e.Cast<dynamic>
, mas diz, oCannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
que fiz de errado lá? (Eu olhei para suas fontes, mas eles necessário que você saiba o nome da coluna, o que eu não)Se você quiser apenas os nomes das colunas, poderá:
Mas se você precisar de apenas uma linha, eu gosto da minha adição ao AdoHelper. Essa adição é excelente se você tiver uma consulta de linha única e não quiser lidar com a tabela de dados em seu código. Ele está retornando um dicionário que diferencia maiúsculas de minúsculas de nomes e valores de colunas.
fonte
throw ex;
é uma prática pior.Eu uso o método GetSchemaTable , que é exposto através da interface IDataReader.
fonte
Use um método de extensão:
fonte
Você com certeza pode.
Isto é originalmente de: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
fonte
É mais fácil alcançá-lo no SQL
fonte