Saltar al contenido

Verifique el nombre de la columna en un objeto SqlDataReader

Luego de consultar expertos en la materia, programadores de diversas áreas y maestros hemos dado con la solución al dilema y la compartimos en esta publicación.

Solución:

public static class DataRecordExtensions

    public static bool HasColumn(this IDataRecord dr, string columnName)
    
        for (int i=0; i < dr.FieldCount; i++)
        
            if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
                return true;
        
        return false;
    

Usando Exceptions para la lógica de control como en algunas otras respuestas se considera una mala práctica y tiene costos de rendimiento. también envía false positivos para el generador de perfiles de # excepciones lanzadas y que Dios ayude a cualquiera que configure su depurador para interrumpir las excepciones lanzadas.

GetSchemaTable() también es otra sugerencia en muchas respuestas. Esta no sería una forma preferida de verificar la existencia de un campo, ya que no está implementado en todas las versiones (es abstracto y lanza NotSupportedException en algunas versiones de dotnetcore). GetSchemaTable también tiene un rendimiento excesivo, ya que es una función bastante resistente si revisa la fuente.

Recorrer los campos puede tener un pequeño impacto en el rendimiento si lo usa mucho y es posible que desee considerar almacenar en caché los resultados.

Es mucho mejor usar esta función booleana:

r.GetSchemaTable().Columns.Contains(field)

Una llamada, sin excepciones. Podría arrojar excepciones internamente, pero no lo creo.

NOTA: En los comentarios a continuación, descubrimos esto... el código correcto es en realidad este:

public static bool HasColumn(DbDataReader Reader, string ColumnName)  
    foreach (DataRow row in Reader.GetSchemaTable().Rows)  
        if (row["ColumnName"].ToString() == ColumnName) 
            return true; 
     //Still here? Column not found. 
    return false; 

En una línea, use esto después de la recuperación de su DataReader:

var fieldNames = Enumerable.Range(0, dr.FieldCount).Select(i => dr.GetName(i)).ToArray();

Después,

if (fieldNames.Contains("myField"))
{
    var myFieldValue = dr["myField"];
    ...

Editar

Una sola línea mucho más eficiente que no requiere cargar el esquema:

var exists = Enumerable.Range(0, dr.FieldCount).Any(i => string.Equals(dr.GetName(i), fieldName, StringComparison.OrdinalIgnoreCase));

Te mostramos comentarios y puntuaciones

Recuerda que puedes comunicar este post si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *