while read oracledatareader executereader example c# boolean bit sqldatareader

executereader - oracledatareader c#



¿Cómo obtener un valor de bit con SqlDataReader y convertirlo en bool? (4)

Estoy recuperando información de usuario de una base de datos mediante una consulta simple.

select * from dbo.[User] u where u.Email = @email

Luego trato de obtener el valor de una columna, llamada IsConfirmed (que se representa como una columna de tipo de bit en la base de datos) y la convierto a bool.

bool isConfirmed = int.Parse(sqlDataReader["IsConfirmed"].ToString()) == 1;

Luego recibo un error de FormatException, que indica que "la cadena de entrada no tenía el formato correcto".

Vi una pregunta similar con una respuesta que proporciona este código:

bool isConfirmed = sqlDataReader.GetBoolean(0);

Pero esto no funcionará con mi caso, porque no conozco el índice de la columna IsConfirmed y no quiero saberlo. Quiero usar el nombre de la columna.


El valor devuelto por la propiedad del indexador del lector de datos es de tipo objeto, pero puede convertirse en el tipo de datos en el que se ha almacenado.

Prueba esto:

bool isConfirmed = (bool)sqlDataReader["IsConfirmed"]


Pruebe esto: Convert.ToBoolean(reader["Columnname"]) o con Ordinal, por ejemplo: Convert.ToBoolean((3))


Si quieres usar el nombre de la columna puedes usar

bool isConfirmed = sqlDataReader.GetBoolean(sqlDataReader.GetOrdinal("IsConfirmed"));


Su código debería funcionar si no tiene ningún valor nulo en su columna IsConfirmed .
Por lo general, estas columnas de bits tienen una propiedad NO NULA y / o un valor predeterminado de 0, pero podría tener un valor nulo y, en este caso, su código fallará con el error mencionado.

Podría arreglarlo de esta manera (sin embargo, necesitará la posición de la columna para esta comprobación)

int colPos = sqlDataReader.GetOrdinal("IsConfirmed"); bool isConfirmed = sqlDataReader.IsDBNull(colPos) ? false : sqlDataReader.GetBoolean(colPos));

Si realmente no te gusta tener una llamada para encontrar la posición de la columna, puedes crear un método de extensión que te permita ocultar la llamada.

public static class ReaderExtensions { public static bool IsDBNull(this SqlDataReader reader, string colName) { int colPos = reader.GetOrdinal(colName); return reader.IsDBNull(colPos); } }

y llámalo con

bool isConfirmed = int.Parse((sqlDataReader.IsDBNull("IsConfirmed") ? "0" : sqlDataReader["IsConfirmed"].ToString())) == 1;