Table est nulle DateTime, mais DataSet jette une exception?

j'essaie d'utiliser le concepteur de L'ensemble de données pour créer une datatable à partir d'une requête. J'ai eu cette baisse de l'amende juste. La requête utilisée renvoie une colonne de datetime nulle de la base de données. Mais, quand il fait autour de ce code:

DataSet1.DataTable1DataTable table = adapter.GetData();

ceci envoie une forte exception de type:

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public System.DateTime event_start_date {
    get {
        try {
            return ((global::System.DateTime)(this[this.tableDataTable1.event_start_dateColumn]));
        }
        catch (global::System.InvalidCastException e) {
            throw new global::System.Data.StrongTypingException("The value for column 'event_start_date' in table 'DataTable1' is DBNull.", e);
        }
    }
    set {
        this[this.tableDataTable1.event_start_dateColumn] = value;
    }
}

comment utiliser le concepteur pour permettre la nullité de cette colonne?

20
demandé sur Amy 2009-10-28 20:18:50

8 réponses

les ensembles de données dactylographiées ne supportent pas les types annulables. Ils soutiennent nullable colonnes.

le générateur de jeu de données dactylographié crée des propriétés non nulles et des méthodes connexes pour manipuler les valeurs nulles. Si vous créez un MyDate colonne de type DateTime et AllowDbNulltrue, le DataRow la sous-classe mettra en œuvre unDateTime propriété nommée MyDate, un SetMyDateNull() méthode, et un IsMyDateNull() méthode. Cela signifie que si vous souhaitez utiliser un type nullable dans votre code, vous devez faire ceci:

DateTime? myDateTime = myRow.IsMyDateNull() ? null : (DateTime?) row.MyDate;

Alors que ce n'est pas totalement défaire le but de l'utilisation des ensembles de données dactylographiés, il craint vraiment. Il est frustrant que les ensembles de données dactylographiées implémentent des colonnes nulles d'une manière qui est moins utilisable que le System.Data méthodes d'extension, par exemple.

est particulièrement mauvais parce que les ensembles de données dactylographiés utiliser des types nullables dans certains endroits - par exemple, le Add<TableName>Row() méthode pour le tableau contenant la colonne de DateTime non valide décrite ci-dessus prendra un DateTime? paramètre.

il y a longtemps, j'ai posé des questions sur cette question sur les forums MSDN, et finalement le chef de projet de L'ADO a expliqué que les types nullables étaient mis en œuvre en même temps que les ensembles de données dactylographiées, et son équipe n'a pas eu le temps d'intégrer complètement les deux d'ici la date de livraison de .NET 2.0. Et pour autant que je puisse le dire, ils n'ont pas ajouté de nouvelles fonctionnalités aux ensembles de données dactylographiées depuis lors.

40
répondu Robert Rossney 2012-10-15 20:47:01

Merci cela a résolu mon problème similaire : Voici le code. Dans le cas de cette question

Isevent_start_date()

retour si le champ est null.

Dans mon cas: j'ai eu un problème similaire et j'ai utilisé la solution suivante

            //Table's Name is Efforts,
            //Column's name is Target
            //So the dataset would automatically generate a property called IsTargetNull() which can be used to check nullables
            //Create an Adaptor
            EffortsTableAdapter ad = new EffortsTableAdapter();
            ProjectDashBoard.Db.EffortsDataTable efforts = ad.GetData();
            DataColumn targetColumn = new DataColumn();
            targetColumn = efforts.TargetColumn;

            List<DateTime?> targetTime = new List<DateTime?>();
            foreach (var item in efforts)
            {

                //----------------------------------------------------
                //This is the line that we are discussing about : 
                DateTime? myDateTime = item.IsTargetNull() ? null : (DateTime?)item.Target;
                //----------------------------------------------------

                targetTime.Add(myDateTime);

            }
1
répondu Rajesh 2012-07-31 06:41:41

Il semble que le Designer le type de base de données pour la colonne est erroné.

Ouvrir xsd Designer, appuyez sur F4 pour obtenir l' Properties Window ouvrir. Sélectionnez la colonne appropriée et set Nullable (ou quelque chose comme ça, Je ne me souviens pas du nom exact) à vrai.

1
répondu Johannes Rudolph 2012-09-05 12:44:05

pour que cela fonctionne avec LINQ, vous devrez aller aux propriétés des Tables dans votre ensemble de données.xsd. Regardez d'abord et assurez-vous que la colonne est bien réglée à nullable. Ensuite, vous devez regarder la propriété spécifique "NullValue" pour la colonne. Valeur nulle par défaut à "Exception", au moins dans VS 2012. Mettez-le à rien pour VB de sorte que vous pouvez faire "IsNot rien" dans la clause LINQ Where.

1
répondu Jack D Menendez 2013-03-25 20:25:11

j'ai fait ceci pour insérer la valeur NULL dans un DateTime colonne

en supposant que j'ai un nullable DateTime colonne dans la base de données, j'ai récupéré quelques données de la base de données dans un objet appelé response et que je veux insérer nullable DateTime valeur dans la colonne ensemble de données qui a appelé RenewDate:

// create anew row of the same type of your table row
var rw = ds.StudentActionPrintDT.NewStudentActionPrintDTRow();

// check for null value
if(!response.RenewDate.HasValue)
{
  // if null, then the let DataSet to set it null by it's own way 
  rw.SetRenewDateNull();
}
else
{
  // if not null set value to the datetime value
  rw.RenewDate = response.RenewDate.Value;
}
// add the created row to the dateset [DataSetName].[ColumnName].Add[ColumnName]Row([The Created Row]);
ds.StudentActionPrintDT.AddStudentActionPrintDTRow(rw);
1
répondu fawzy mokhtar 2018-03-21 15:41:20

Le Système.Objet DateTime n'est pas les valeurs null. Pour rendre une DateTime nullable, en faire une DateTime? (mettre un ? après DateTime)

DateTime? nullableDateTime = null;
-1
répondu Aaron 2009-10-28 17:28:04

j'utilise le code ci-dessous pour gérer les cellules nulles dans une feuille Excel qui est lue dans un datatable.

if (!reader.IsDBNull(0))                                
{                                    
  row["DateOnCall"] = (DateTime)reader[0];
}
-1
répondu Tequila 2012-11-02 13:47:08

il semble différent avec datable et fortement typé datable... L'utilisation de ce genre.

DataSet1.DataTable1DataTable table = new DataSet1.DataTable1DataTable();
table.Merge(adapter.GetData().CopyToDataTable());
-1
répondu Onur Öçalan 2016-06-13 13:02:34