58 votes

Comment vérifier si un datareader est nul ou vide ?

J'ai un datareader qui renvoie une liste d'enregistrements d'une base de données sql server. J'ai un champ dans la base de données appelé "Additional". Ce champ est 50% du temps vide ou nul.

J'essaie d'écrire un code qui vérifie si ce champ est nul. La logique derrière cela est la suivante : Si le champ "Additional" contient du texte, il faut afficher l'information, sinon il faut cacher le champ.

J'ai essayé :

if (myReader["Additional"] != null)
{
    ltlAdditional.Text = "contains data";
}
else
{
     ltlAdditional.Text = "is null";
}

Le code ci-dessus me donne cette erreur :

Détails de l'exception : System.IndexOutOfRangeException : Supplémentaire

Toute aide serait grandement appréciée...


Voir aussi :

Vérifier le nom de la colonne dans un objet SqlDataReader

82voto

Robert Durgin Points 938
if (myReader["Additional"] != DBNull.Value)
{
    ltlAdditional.Text = "contains data";
}
else
{
     ltlAdditional.Text = "is null";
}

1 votes

Merci pour votre réponse Robert, j'ai essayé le code que vous avez suggéré mais cela me donne toujours "System.IndexOutOfRangeException : Additional" parce que dans ce cas "Additional" est null.

0 votes

Bien qu'il s'agisse d'un ancien message, en VB "If reader("Additional") <> System.DBNull.Value Then" ce code renvoie l'erreur "Operator '<>' is not defined for types 'Object' and 'System.DBNull'".

0 votes

En VB, la syntaxe est "If Not reader("Additional") Is DBNull.Value Then".

15voto

if (myReader.HasRows) //The key Word is **.HasRows**

{

    ltlAdditional.Text = "Contains data";

}

else

{   

    ltlAdditional.Text = "Is null Or Empty";

}

0 votes

Merci, cela m'a aidé mais dans Windows Phone 8.1, cela devrait être myReader.HasRows, sans "()".

0 votes

Cela répond à ma question et à la question du titre, mais le message original suggère que le titre est totalement faux. Je suis content qu'il soit ici pour les personnes qui cherchent une réponse à la question du titre. C'est juste triste que ce soit si bas...

0 votes

Je ne suis pas sûr que cela soit valable pour la circonstance. À moins que l'exécution de la requête n'échoue, le SqlReader aura TOUJOURS au moins une ligne vide dans l'ensemble de données.

11voto

Kevin Nelson Points 1798

Je n'ai pas utilisé de DataReaders depuis plus de 3 ans, j'ai donc voulu confirmer ma mémoire et j'ai trouvé ceci. Quoi qu'il en soit, si, comme moi, vous tombez sur cet article et que vous voulez une méthode pour tester IsDBNull en utilisant le nom de la colonne au lieu du numéro ordinal, et que vous utilisez VS 2008+ (& .NET 3.5 je pense), vous pouvez écrire une méthode d'extension afin de pouvoir passer le nom de la colonne :

public static class DataReaderExtensions
{
    public static bool IsDBNull( this IDataReader dataReader, string columnName )
    {
        return dataReader[columnName] == DBNull.Value;
    }
}

Kevin

9voto

Ahmed Fahmy Points 69

Voici la solution correcte et éprouvée

if (myReader.Read())
{

    ltlAdditional.Text = "Contains data";
}
else
{   
    ltlAdditional.Text = "Is null";
}

2 votes

Et si leur si NULL dans une colonne particulière ?

0 votes

L'appel de .Read() lit la première ligne, donc si DataReader est passé dans une méthode/fonction avec while(DataReader.Read()), la première ligne sera-t-elle alors ignorée ? Si c'est le cas, je suppose que nous pourrions utiliser un do while.

0 votes

Ce test ne sera effectué que si le DataReader contient des lignes. La question était de savoir comment tester les valeurs NULL dans des champs spécifiques. Docs IDataReader : msdn.microsoft.com/fr/us/library/

7voto

catalyst Points 21

J'utilise également OleDbDataReader.IsDBNull().

if ( myReader.IsDBNull(colNum) ) { retrievedValue = ""; }
else { retrievedValue = myReader.GetString(colNum); }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X