read executereader example ejemplos data c# ado.net sqldatareader

c# - executereader - ¿Puede obtener los nombres de columna de un SqlDataReader?



read data sqldatareader c# (9)

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


Es más fácil lograrlo en SQL.

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


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

A la inversa, hay un GetOrdinal que toma un nombre de columna y devuelve el índice de 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 }


Seguro que 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


Si solo quieres los nombres de columna, puedes hacer:

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

Pero si solo necesitas una fila, me gusta mi complemento AdoHelper. Esta adición es excelente si tiene una consulta de una sola línea y no desea tratar la tabla de datos en su código. Está devolviendo un diccionario que no distingue entre mayúsculas y minúsculas de nombres y valores de columnas.

public static Dictionary<string, string> ExecuteCaseInsensitiveDictionary(string query, string connectionString, Dictionary<string, string> queryParams = null) { Dictionary<string, string> CaseInsensitiveDictionary = new Dictionary<string, string>(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; }


Utilice un método de extensión:

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


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


Ya mencionado. Sólo una respuesta LINQ :

var columns = reader.GetSchemaTable().Rows .Cast<DataRow>() .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 enfoque, la consulta será muy lenta.


var reader = cmd.ExecuteReader(); var columns = new List<string>(); for(int i=0;i<reader.FieldCount;i++) { columns.Add(reader.GetName(i)); }

o

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