6
votes

Problème avec des types nullables, des dbnulls et des lignes de données

J'ai vu Ce fil sur le débordement de la pile En ce qui concerne la conversion entre les types dbnull et nullables, mais je suis toujours confus. J'ai écrit du code comme celui-ci avec un code de piratage pour traiter des types nullables pour DateTime et Ints que je vais montrer ci-dessous, mais je veux utiliser des types nullables: xxx pré>

ron est Maintenant défini comme suit: P>

 RON_ID                                    NOT NULL VARCHAR2(40)
 STAFF_NUM                                 NOT NULL VARCHAR2(12)
 CHECKIN_DATE                              NOT NULL DATE
 NONMISSION_IND                            NOT NULL VARCHAR2(1)
 COMMENTS                                           VARCHAR2(4000)
 NONCOMPLY_IND                                      VARCHAR2(4000)
 PROPERTY_ID                               NOT NULL NUMBER(38)
 PROPERTY_CHAIN                                     VARCHAR2(2)
 PROPERTY_NAME                                      VARCHAR2(255)
 RON_AIRPORT                               NOT NULL VARCHAR2(3)
 PROPERTY_STREET                                    VARCHAR2(255)
 PROPERTY_STREET2                                   VARCHAR2(255)
 PROPERTY_CITY                                      VARCHAR2(255)
 PROPERTY_STATE                                     VARCHAR2(3)
 PROPERTY_POSTALCODE                                VARCHAR2(255)
 PROPERTY_PHONE                                     VARCHAR2(20)
 PROPERTY_FAX                                       VARCHAR2(20)
 PROPERTY_COUNTRY                                   VARCHAR2(2)
 PROPERTY_LONGITUDE                                 NUMBER
 PROPERTY_LATITUDE                                  NUMBER
 PROPERTY_AIRPORT                                   VARCHAR2(3)
 REPORTED_BY                                        VARCHAR2(50)
 REPORTED_DTS                              NOT NULL DATE
 CANCELED_BY                                        VARCHAR2(50)
 CANCELED_DTS                                       DATE


0 commentaires

4 Réponses :


8
votes

Pour définir un type de valeur (telle que DateTime) comme nullable ... Effectuez l'une des opérations suivantes:

select new RON
           {
               RONId = dr.Field<string>("RON_ID"),
               // snip...
               CheckInDate = dr.Field<DateTime?>("CHECKIN_DATE"),
               // snip...
           };


5 commentaires

Merci! Alors datetime? nullabledate = datarow.field ("Nom de colonne"); Que serait-ce dans mon exemple?


J'ai eu une "distribution spécifiée n'est pas valide."} [System.invalidcastexception]: {"Cast spécifié n'est pas valide."} Données: {System.Collections.ListDictionaryinernal} helplink: NULL INNEREXCEPECTION: NULL Message: "Cast non spécifié n'est pas valide." Source: "System.Data.DataSetTextensions" StackTrace: "at system.data.datarsexsions.unboxt`1.Nullablefield [telem] (valeur d'objet) \ r \ n au système.data.datarowexsions.field [t] (da


... Lorsque vous essayez de faire checkindate = dr.field ("Checkin_Date"), après avoir défini le champ comme DateTime?


Eh bien ... Regardez plus près de votre exemple le schéma indique que Checkin_Date est défini comme non NULL. Pas besoin de changer celui-ci à un nullable car il ne peut jamais être nul dans la base de données.


Donc annulé_dts est le seul champ que je dois m'inquiéter selon cela



0
votes

Comme seuls les types de valeur peuvent être effectués nullable , vous n'aurez rien à faire de spécial pour les chaînes. Les types primitifs (et DateTime ) peuvent être déclarés nullables en ajoutant un point d'interrogation après leur nom de type, comme int? Nullablenumber {obtenir; ensemble; } .


1 commentaires

Merci, c'est ce que je pensais



0
votes

Vous devrez peut-être comparer contre DBNULL avant d'attribuer une DateTime ou NULL

myNullableDate = (DBNull.Value == list.Field<object>("FOO"))
          ? null 
          : (DateTime?)list.Field<DateTime?>("FOO");


0 commentaires

1
votes

en examinant votre question originale, Je vois qu'une erreur se produira lorsque .tostring () est appelé une valeur null. < Pré> xxx

DATABLE DT = DS.Tables [0]; LISTE LISTE = (de DR en DT.Seneumérable () Sélectionnez Nouveau Ron { Ronid = dr.isnull ("ronid")? "0": dr.field ("ronid"), StaffNumber = Dr.ISNULL ("StaffNumber")? "0": Dr.Field ("StaffantatNumber"), ... etc, ... etc }).Lister(); liste de retour; }

PS:

  • Sonde votre jeu de données pour les valeurs de champ à correspondre. Ici, j'ai supposé que votre jeu de données "columname" avait le même nom que la variable qu'il est transmis, mais ce n'est pas toujours le cas.
  • mot de conseil, utilisez "Columnomame" au lieu de l'index car l'index peut modifier lorsque DB modifie, stocké Proc ou vos modifications de requête.

0 commentaires