Comment utiliser l'objet datareader avec des valeurs null
Dire que j'ai de cette classe:
class myclass
{
public int Field1{ get; set; }
public int? Field2 { get; set; } //Note Field2 is nullable
}
Je suis en train de remplir une liste générique avec des données provenant d'une base de données. Comme GetSqlInt32 implémente INullable j'aurais pensé que le code ci-dessous fonctionne. Il n'a pas. Elle génère une erreur si Champ2 est null.
List<myclass> mylist=new List<myclass>();
int Field1_Ordinal = rdr.GetOrdinal("Field1");
int Field2_Ordinal = rdr.GetOrdinal("Field2");
SqlDataReader rdr = cmd.ExecuteReader(); //Execute a stored procedure to retrieve data from the database
while (rdr.Read())
{
mylist.Add(new myclass
{
Field1 = rdr.GetSqlInt32(Field1_Ordinal).Value,
Field2 = rdr.GetSqlInt32(Field2_Ordinal).Value //Error if field2 is null
});
}
Des idées pourquoi il ne fonctionne pas?
OriginalL'auteur Anthony | 2009-09-01
Vous devez vous connecter pour publier un commentaire.
Il me semble que vous avez besoin d'une conversion comme ceci (à l'aide d'une méthode d'extension pour plus de commodité):
Alors:
(Commentaire sur les autres réponses: il n'y a pas besoin de mettre des
DbNull
dans ce, queSqlInt32
peut déjà représenter les valeurs null. Vous avez juste besoin de détecter qu'avant d'utiliserValue
.)La simplicité, dans le fond. La version pensez-vous est plus facile à lire? 🙂 (Oui, cela signifie avoir la prolongation supplémentaire de la méthode, mais vous avez seulement besoin que , cependant, beaucoup de nullable int champs que vous avez.)
Vous pouvez également créer une extension de la méthode sur l'objet DataReader appelé GetNullableInt32 ou quelque chose comme ça, bien sûr.
une extension de la méthode sur l'objet DataReader est probablement la meilleure façon. Une fois créé, je n'ai pas à m'en soucier. Merci.
Ne devrait pas le lecteur.GetFieldValue<int?> être en mesure de traiter les valeurs nulles?
OriginalL'auteur Jon Skeet
Découvrez cette solution qui n'a pas été écrit par moi:
Il a été proposé à l'origine ici:
SQL Lecteur de Données - manipulation des valeurs de colonne Null
OriginalL'auteur Ignacio Soler Garcia
Voici une réduction de la douleur variation sur le thème. Si quelqu'un sait comment faire pour fusionner Val et le Ref dans une fonction de modèle hésitez pas à poster. Vous devrez indiquer le type explicitement (C# compilé ne peuvent pas être dérangé 🙂 mais c':
est encore maked mes doigts heureux 🙂
OriginalL'auteur ZXX
Je pense c'est parce que la valeur retournée est
DBNull.Value
, et pasnull
.Au lieu de cela, vous pouvez utiliser le IsDbNull() méthode pour vérifier si le champ est null, avant de le lire.
OriginalL'auteur Rune Grimstad
Vous devez utiliser une méthode particulière pour le lecteur de détecter si la valeur est null
OriginalL'auteur Charles Bretana
J'essaye d'exporter une base de données Access avec 39 champs - de nombreux avec des valeurs NULL. Je ne pouvais pas obtenir l'extension de la méthode de travail, j'ai donc écrit la fonction suivante:
Comme je l'ai lu chaque champ peut contenir une valeur NULL, je code le champ de lecture:
ChkDbStr(DbReader.GetValue(1))
OriginalL'auteur TcTom
DbNull.La valeur != null
Si vous avez besoin d'un ? : expression ou d'un bloc si pour convertir la base de données de valeurs null en c# les valeurs null et vica versa.
OriginalL'auteur MatthewMartin