Después de conectarme a la base de datos, ¿puedo obtener el nombre de todas las columnas que se devolvieron en mi SqlDataReader
?
c#
ado.net
sqldatareader
Blankman
fuente
fuente
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Hay una
GetName
función en laSqlDataReader
que acepta el índice de columna y devuelve el nombre de la columna.Por el contrario, hay una
GetOrdinal
que toma el nombre de una columna y devuelve el índice de la columna.fuente
GetOrdinal
fue perfecto. Estaba buscandoGetName
, pero una solución mucho más limpia para mi problema conGetOrdinal
.Puede obtener los nombres de columna de un DataReader.
Aquí está la parte importante:
fuente
Ya mencionado. Solo una respuesta LINQ :
El segundo es más limpio y mucho más rápido. Incluso si almacena
GetSchemaTable
en caché en el primer enfoque, la consulta será muy lenta.fuente
reader.Cast<IDataRecord>().ToList()
. Creo que podría usardynamic
palabras clave allí en lugar de hacerlo,IDataRecord
pero sin ningún beneficio.DataTable
fue diseñado para facilitar la carga de una vez, por lo que también puede usarlo, pero pierde el beneficio de cargar a pedido (con el lector de datos puede detener la carga en cualquier momento), comovar dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. Hay muchas bibliotecas que pueden automatizar esto para usted, encuéntrelas aquí stackoverflow.com/questions/11988441 y aquí stackoverflow.com/questions/1464883reader.Cast<IEnumerable<dynamic>>
y.Cast<dynamic>
, pero dice,Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
¿qué hice mal allí? (Miré sus fuentes, pero le exigieron que supiera el nombre de la columna, lo cual no sé)Si solo desea los nombres de columna, puede hacer:
Pero si solo necesita una fila, me gusta mi adición AdoHelper. Esta adición es excelente si tiene una consulta de una sola línea y no desea tratar con la tabla de datos en su código. Está devolviendo un diccionario de mayúsculas y minúsculas de nombres y valores de columna.
fuente
throw ex;
Es una peor práctica.Utilizo el método GetSchemaTable , que se expone a través de la interfaz IDataReader.
fuente
Use un método de extensión:
fuente
Seguro que puedes.
Esto es originalmente de: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
fuente
Es más fácil lograrlo en SQL
fuente