7
votes

Comment utiliser DigneAreader avec des valeurs null

dire que j'ai cette classe: xxx pré>

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
   });
 }


0 commentaires

7 Réponses :


0
votes

dbnull.value! = null

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.


0 commentaires

1
votes

i pense c'est Beacuse La valeur renvoyée est dbnull.value , et pas null . .

à la place, vous pouvez utiliser la méthode ISDBNull () pour vérifier si le champ est null avant de le lire.


1 commentaires

La valeur renvoyée est un SQLINT32, pas un dbnull.value.



1
votes

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
});


1 commentaires

Dans mon cas: Field2 = rdr.isdbnull (field2_ordininal)? (int?) NULL: RDR.GETSQLINT32 (Field2_Andinal) .Value merci pour votre réponse.



24
votes

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()


7 commentaires

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 , 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 Être capable de gérer les valeurs null?


@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.



4
votes

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;
}


0 commentaires

1
votes

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: xxx

comme je lis chaque champ pouvant contenir une null, je code le champ Lire comme suit: Chkdbstr (dbreader.getvalue (1))


0 commentaires

6
votes

Consultez cette solution qui n'a pas été écrite par moi: xxx

Il a été proposé ici:

SQL Data Reader - Manipulation des valeurs de colonne NULL


0 commentaires