valor una tiene seleccionar saber obtener net leer fila existe datos columna celda buscar c# idatareader

c# - tiene - saber si una columna existe en un datatable vb net



Verificando si existe una columna en un lector de datos (7)

Esta pregunta ya tiene una respuesta aquí:

¿Hay alguna forma de ver si existe un campo en un objeto basado en IDataReader sin comprobar si hay una excepción IndexOutOfRangeException?

En esencia, tengo un método que toma un objeto basado en IDataReader y crea una lista fuertemente tipada de los registros. En 1 instancia, un lector de datos tiene un campo que otros no. Realmente no quiero volver a escribir todas las consultas que alimentan este método para incluir alguna forma de este campo si no es necesario. La única forma en que he podido descifrar cómo hacerlo hasta el momento es arrojar el único campo 1 en un bloque try / catch como se muestra a continuación.

try { tmp.OptionalField = reader["optionalfield"].ToString(); } catch (IndexOutOfRangeException ex) { //do nothing }

¿Hay una forma más limpia de agregar el "campo opcional" a las otras consultas o copiar el método de carga, por lo que una versión usa el campo opcional y la otra no?

Estoy en el marco 2.0 también.


Cargarlo en una DataTable y luego puede verificar la columna:

DataTable dataTable = new DataTable(); dataTable.Load(reader); foreach (var item in dataTable.Rows) { bool columnExists = item.Table.Columns.Contains("ColumnName"); }


Esto debería funcionar, prueba esto:

private static bool ColumnExists(SqlDataReader reader, string columnName) { using (var schemaTable = reader.GetSchemaTable()) { if (schemaTable != null) schemaTable.DefaultView.RowFilter = String.Format("ColumnName= ''{0}''", columnName); return schemaTable != null && (schemaTable.DefaultView.Count > 0); } }


Lo siguiente le dará una lista de las cadenas de nombre de columna dadas a un lector de datos. (Recuerde que los resultados se basan en la última lectura, por lo que puede no ser el mismo según lo que lea el lector).

var cols = reader.GetSchemaTable() .Rows .OfType<DataRow>() .Select(row => row["ColumnName"]);

O para verificar si existe una columna:

public bool ColumnExists(IDataReader reader, string columnName) { return reader.GetSchemaTable() .Rows .OfType<DataRow>() .Any(row => row["ColumnName"].ToString() == columnName); }


No necesitas tanta complicación, solo esto:

bool bFieldExists = datareader.GetSchemaTable().Columns.Contains(strFieldName);


Parece que estoy corregido. Sé que los nombres reales de sus columnas están ahí, pero estaba yendo por el camino equivocado. Esta referencia ayudó a aclarar un poco las cosas, pero todavía no estoy seguro de si hay una forma elegante de hacerlo. Adaptado del enlace anterior, puede obtener una lista de todas sus columnas con lo siguiente:

List<string> myCols = new List<string>(); DataTable schema = reader.GetSchemaTable(); foreach (DataRow row in schema.Rows) { myCols.Add(row[schema.Columns["ColumnName"]]); }

Lamentablemente, parece que solo se puede acceder a schema.Rows por índice, por lo que no estoy seguro de que pueda moverse por las filas antes de verificar por nombre. En ese caso, ¡su solución original parece mucho más elegante!

Nota: mi respuesta original sugirió verificar la presencia de una columna simplemente por: reader.GetSchemaTable (). Columnas ["optionalfield"].


Terminé encontrando una solución usando el reader.GetName(int) . Creé el siguiente método para abarcar la lógica.

public bool ColumnExists(IDataReader reader, string columnName) { for (int i = 0; i < reader.FieldCount; i++) { if (reader.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase)) { return true; } } return false; }


Enumerable.Range(0, reader.FieldCount).Any(i => reader.GetName(i) == "ColumnName")