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 ...
if (myReader["Additional"] != DBNull.Value)
{
ltlAdditional.Text = "contains data";
}
else
{
ltlAdditional.Text = "is null";
}
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
if (myReader.HasRows) //The key Word is **.HasRows**
{
ltlAdditional.Text = "Contains data";
}
else
{
ltlAdditional.Text = "Is null Or Empty";
}
C'est la solution correcte et testée
if (myReader.Read())
{
ltlAdditional.Text = "Contains data";
}
else
{
ltlAdditional.Text = "Is null";
}
J'utilise aussi OleDbDataReader.IsDBNull ()
if ( myReader.IsDBNull(colNum) ) { retrievedValue = ""; }
else { retrievedValue = myReader.GetString(colNum); }
Tout d’abord, vous voudrez probablement rechercher une DBNull
pas une Null
régulière.
Ou vous pouvez regarder la méthode IsDBNull
@ 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?
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.
Essayez cette syntaxe équivalente plus simple:
ltlAdditional.Text = (myReader["Additional"] == DBNull.Value) ? "is null" : "contains data";
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"
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é.
Ce
Exemple:
objCar.StrDescription = (objSqlDataReader["fieldDescription"].GetType() != typeof(DBNull)) ? (String)objSqlDataReader["fieldDescription"] : "";