¿Puedes obtener los nombres de las columnas de un SqlDataReader?

Después de conectarme a la base de datos, ¿puedo obtener el nombre de todas las columnas que fueron devueltas en mi SqlDataReader ?

 var reader = cmd.ExecuteReader(); var columns = new List(); for(int i=0;i 

o

 var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList(); 

Hay una función GetName en el SqlDataReader que acepta el índice de columna y devuelve el nombre de la columna.

Por el contrario, hay un GetOrdinal que toma el nombre de una columna y devuelve el índice de la columna.

Puede obtener los nombres de columna de un DataReader.

Aquí está la parte importante:

  for (int col = 0; col < SqlReader.FieldCount; col++) { Console.Write(SqlReader.GetName(col).ToString()); // Gets the column name Console.Write(SqlReader.GetFieldType(col).ToString()); // Gets the column type Console.Write(SqlReader.GetDataTypeName(col).ToString()); // Gets the column database type } 

Ya mencionado. Solo una respuesta LINQ :

 var columns = reader.GetSchemaTable().Rows .Cast() .Select(r => (string)r["ColumnName"]) .ToList(); //Or var columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName) .ToList(); 

El segundo es más limpio y mucho más rápido. Incluso si almacena en caché GetSchemaTable en el primer acercamiento, la consulta va a ser muy lenta.

Si solo desea los nombres de columna, puede hacer:

 List columns = new List(); using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) { DataTable dt = reader.GetSchemaTable(); foreach (DataRow row in dt.Rows) { columns.Add(row.Field("ColumnName")); } } 

Pero si solo necesitas una fila, me gusta mi adición AdoHelper. Esta adición es excelente si tiene una consulta de línea única y no desea tratar con la tabla de datos en su código. Está devolviendo un diccionario insensible a mayúsculas / minúsculas de nombres y valores de columna.

 public static Dictionary ExecuteCaseInsensitiveDictionary(string query, string connectionString, Dictionary queryParams = null) { Dictionary CaseInsensitiveDictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); try { using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); using (SqlCommand cmd = new SqlCommand()) { cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = query; // Add the parameters for the SelectCommand. if (queryParams != null) foreach (var param in queryParams) cmd.Parameters.AddWithValue(param.Key, param.Value); using (SqlDataReader reader = cmd.ExecuteReader()) { DataTable dt = new DataTable(); dt.Load(reader); foreach (DataRow row in dt.Rows) { foreach (DataColumn column in dt.Columns) { CaseInsensitiveDictionary.Add(column.ColumnName, row[column].ToString()); } } } } conn.Close(); } } catch (Exception ex) { throw ex; } return CaseInsensitiveDictionary; } 

Use un método de extensión:

  public static List ColumnList(this IDataReader dataReader) { var columns = new List(); for (int i = 0; i < dataReader.FieldCount; i++) { columns.Add(dataReader.GetName(i)); } return columns; } 

Tu puedes.

 protected void GetColumNames_DataReader() { System.Data.SqlClient.SqlConnection SqlCon = new System.Data.SqlClient.SqlConnection("server=localhost;database=northwind;trusted_connection=true"); System.Data.SqlClient.SqlCommand SqlCmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM Products", SqlCon); SqlCon.Open(); System.Data.SqlClient.SqlDataReader SqlReader = SqlCmd.ExecuteReader(); System.Int32 _columncount = SqlReader.FieldCount; System.Web.HttpContext.Current.Response.Write("SqlDataReader Columns"); System.Web.HttpContext.Current.Response.Write(" "); for ( System.Int32 iCol = 0; iCol < _columncount; iCol ++ ) { System.Web.HttpContext.Current.Response.Write("Column " + iCol.ToString() + ": "); System.Web.HttpContext.Current.Response.Write(SqlReader.GetName( iCol ).ToString()); System.Web.HttpContext.Current.Response.Write(" "); } } 

Esto es originalmente de: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik

Uso el método GetSchemaTable , que se expone a través de la interfaz IDataReader.

Es más fácil lograrlo en SQL

 var columnsList = dbContext.Database.SqlQuery("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'SCHEMA_OF_YOUE_TABLE' AND TABLE_NAME = 'YOUR_TABLE_NAME'").ToList();