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?
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 AllowDbNull
true
, 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.
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);
}
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.
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.
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);
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;
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];
}
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());