web-dev-qa-db-fra.com

Comment obtenir une valeur de bit avec SqlDataReader et le convertir en bool?

Je récupère les informations utilisateur d'une base de données à l'aide d'une requête simple.

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

J'essaie ensuite d'obtenir la valeur d'une colonne, appelée IsConfirmed (représentée sous la forme d'une colonne de type bit dans la base de données) et de la convertir en bool.

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

Je reçois alors une erreur FormatException, indiquant que "La chaîne d'entrée n'était pas au format correct".

J'ai vu une question similaire avec une réponse fournissant ce code:

bool isConfirmed = sqlDataReader.GetBoolean(0);

Mais cela ne fonctionnera pas avec mon cas, car je ne connais pas l'index de la colonne IsConfirmed et je ne veux pas le savoir. Je veux utiliser le nom de la colonne.

16
Yulian

La valeur renvoyée par la propriété d'indexeur de lecteur de données est de type objet, mais peut être transposée dans le type de données sous lequel elle a été stockée.

Essaye ça:

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

Si vous voulez utiliser le nom de la colonne, vous pouvez utiliser

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

Votre code devrait fonctionner si vous n'avez aucune valeur null dans votre colonne IsConfirmed.
Généralement, ces colonnes de bits ont une propriété NOT NULL et/ou une valeur par défaut de 0, mais il peut arriver qu’elle ait une valeur null et, dans ce cas, votre code échouera avec l’erreur mentionnée. 

Vous pouvez le réparer de cette façon (vous aurez cependant besoin de la position de la colonne pour cette vérification)

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

Si vous n'aimez vraiment pas avoir un appel pour trouver la position de la colonne, vous pouvez créer une méthode d'extension vous permettant de masquer l'appel.

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

et appelez avec

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

Essayez ceci: Convert.ToBoolean(reader["Columnname"]) ou avec Ordinal par exemple: Convert.ToBoolean((3))

0
Yaina Villafañes