dire que j'ai cette classe: J'essaie de remplir une liste générique avec des données provenant d'une base de données. Comme GetQlint32 implémente inaudable, j'aurais pensé que le code ci-dessous fonctionnerait. Ce n'est pas le cas. Il génère une erreur si le champ2 est null. P> 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
});
}
7 Réponses :
dbnull.value! = null p>
Vous avez donc besoin d'un? : expression ou un bloc IF pour convertir les nulls de la base de données en C # NULLS et VICA VERSA. P>
i pense em> c'est Beacuse La valeur renvoyée est à la place, vous pouvez utiliser la méthode ISDBNull () pour vérifier si le champ est null avant de le lire. P> dbnull.value code>, et pas
null code>. p>.
La valeur renvoyée est un SQLINT32, pas un dbnull.value.
Vous devez utiliser une méthode spéciale sur le lecteur à détecter lorsque la valeur est NULL
mylist.Add(new myclass { Field1 = rdr.IsDbNull(Field1_Ordinal)? 0: rdr.GetSqlInt32(Field1_Ordinal).Value, Field2 = rdr.IsDbNull(Field2_Ordinal)? 0: // whatever default value you wish... rdr.GetSqlInt32(Field2_Ordinal).Value // No error now });
Dans mon cas: Field2 = rdr.isdbnull (field2_ordininal)? (int?) NULL: RDR.GETSQLINT32 (Field2_Andinal) .Value merci pour votre réponse.
Il me semble que vous avez besoin d'une conversion comme celle-ci (à l'aide d'une méthode d'extension pour commodité):
Field2 = rdr.GetSqlInt32(Field2_Ordinal).ToNullableInt32()
Merci pour cela, mais pourquoi pas quelque chose comme ça sans utiliser de méthode d'extension: champ2 = (rdr.isdbnull (field2_ordinal)? (Int?) Null: RDR.GetsQlint32 (Field2_ORDININAL) .Value).
@Anthony: simplicité, fondamentalement. Quelle version pensez-vous est plus facile à lire? :) (Oui, cela signifie avoir la méthode d'extension supplémentaire, mais vous n'avez besoin que de cette une fois i>, mais beaucoup de champs intenses nullables que vous avez.)
Vous pouvez également créer une méthode d'extension sur DigneAreader appelée GetNullableInT32 ou quelque chose comme ça, bien sûr.
@Jon: Une méthode d'extension sur DataReader est probablement la meilleure solution. Une fois créé, je n'ai pas à m'en soucier. Merci.
Devrait-il ne pas laver.getfieldValue
@Farinha: Honnêtement, je ne sais pas si ça fait. La documentation de dbreader.getfieldValue ne mentionne pas ça ...
Vous avez raison, la documentation de Dbreader.getfieldValue Spécifie même quels types informatiques il prend en charge et int? n'est pas l'un d'entre eux. Allé avec la création d'une méthode d'extension comme suggérée.
Voici une variation de réduction de la douleur sur le thème. Si quelqu'un sait comment fusionner VAL et que la fonction dans une seule gabarit est tombée libre de poster. Vous devrez indiquer le type explicitement (C # compilé ne peut pas être dérangé :-) Mais ceci:
public static T Def<T>(this SqlDataReader r, int ord) { var t = r.GetSqlValue(ord); if (t == DBNull.Value) return default(T); return ((INullable)t).IsNull ? default(T) : (T)t; } public static T? Val<T>(this SqlDataReader r, int ord) where T:struct { var t = r.GetSqlValue(ord); if (t == DBNull.Value) return null; return ((INullable)t).IsNull ? (T?)null : (T)t; } public static T Ref<T>(this SqlDataReader r, int ord) where T : class { var t = r.GetSqlValue(ord); if (t == DBNull.Value) return null; return ((INullable)t).IsNull ? null : (T)t; }
J'essaie d'exporter une base de données d'accès avec 39 champs - beaucoup avec des valeurs NULL. Je n'ai pas pu obtenir la méthode de l'extension, donc j'ai écrit la fonction suivante: comme je lis chaque champ pouvant contenir une null, je code le champ Lire comme suit:
Chkdbstr (dbreader.getvalue (1)) p> p>
Consultez cette solution qui n'a pas été écrite par moi: Il a été proposé ici: p>