web-dev-qa-db-fra.com

comment vérifier si un datareader est null ou vide

J'ai un datareader qui retourne une liste d'enregistrements à partir d'une base de données de serveur SQL. J'ai un champ dans la base de données appelé "supplémentaire". Ce champ est vide ou vide à 50% du temps.

J'essaie d'écrire du code qui vérifie si ce champ n'est pas valide. La logique sous-jacente est la suivante:.

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 des exceptions: System.IndexOutOfRangeException: Additional

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


Voir également:

Recherchez le nom de la colonne dans un objet SqlDataReader

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

Je n'ai pas utilisé DataReaders depuis plus de 3 ans, donc je voulais confirmer ma mémoire et j'ai trouvé ceci. Quoi qu'il en soit, pour tous ceux qui consultent ce message comme moi et veulent une méthode pour tester IsDBNull en utilisant le nom de la colonne au lieu du nombre ordinal, et que vous utilisez VS 2008+ (& .NET 3.5 je pense), vous pouvez écrire une méthode d'extension. afin que vous puissiez passer le nom de la colonne dans:

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

Kevin

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

{

    ltlAdditional.Text = "Contains data";

}

else

{   

    ltlAdditional.Text = "Is null Or Empty";

}
10

C'est la solution correcte et testée

if (myReader.Read())
{

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

J'utilise aussi OleDbDataReader.IsDBNull ()

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

Tout d’abord, vous voudrez probablement rechercher une DBNull pas une Null régulière.

Ou vous pouvez regarder la méthode IsDBNull

2
Joe Phillips

@ Joe Philllips

SQlDataReader.IsDBNull (int index) requiert le numéro ordinal de la colonne. Existe-t-il un moyen de vérifier les valeurs NULL à l'aide du nom de colonne, et non pas le nombre ordinal?

1
Shiva

En plus des suggestions données, vous pouvez le faire directement à partir de votre requête comme ceci -

SELECT ISNULL([Additional], -1) AS [Additional]

De cette façon, vous pouvez écrire la condition pour vérifier si la valeur du champ est <0 ou> = 0.

1
Kirtan

Essayez cette syntaxe équivalente plus simple:

ltlAdditional.Text = (myReader["Additional"] == DBNull.Value) ? "is null" : "contains data";
0
cnom

AMG - Désolé, passions un moment blond. Le champ "Supplémentaire" a été ajouté à la base de données après la conception initiale de la base de données.

J'ai mis à jour tout mon code pour utiliser ce nouveau champ, mais j'ai oublié de mettre à jour le code du datareader qui faisait l'appel pour sélectionner les champs de la base de données; par conséquent, il n'appelait pas "Additional"

0
Jason

Je rencontre également ce type de problème, mais le mien, j’utilise DbDataReader comme lecteur générique (pour SQL, Oracle, OleDb, etc.). Si vous utilisez DataTable, DataTable utilise cette méthode:

DataTable dt = new DataTable();
dt.Rows[0].Table.Columns.Contains("SampleColumn");

en utilisant ceci, je peux déterminer si cette colonne existe dans le jeu de résultats de ma requête. Je cherche aussi si DbDataReader a cette capacité.

0
Rob

Ce

Exemple:

objCar.StrDescription = (objSqlDataReader["fieldDescription"].GetType() != typeof(DBNull)) ? (String)objSqlDataReader["fieldDescription"] : "";
0