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
GetNamefunción en laSqlDataReaderque acepta el índice de columna y devuelve el nombre de la columna.Por el contrario, hay una
GetOrdinalque toma el nombre de una columna y devuelve el índice de la columna.fuente
GetOrdinalfue 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
GetSchemaTableen caché en el primer enfoque, la consulta será muy lenta.fuente
reader.Cast<IDataRecord>().ToList(). Creo que podría usardynamicpalabras clave allí en lugar de hacerlo,IDataRecordpero sin ningún beneficio.DataTablefue 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