我正在尝试使用DataSet设计器从查询中创建数据表.我把它弄得很好.使用的查询从数据库返回可为空的datetime列.但是,当它涉及到这段代码时:
DataSet1.DataTable1DataTable table = adapter.GetData();
这会抛出一个StrongTypingException:
[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; } }
如何使用设计器允许此列为Nullable?
类型化数据集不支持可空类型.它们支持可空列.
类型化数据集生成器创建非可空属性以及用于处理空值的相关方法.如果创建一个MyDate
类型DateTime
并AllowDbNull
设置为的列true
,则DataRow
子类将实现一个DateTime
名为non-null的属性MyDate
,一个SetMyDateNull()
方法和一个IsMyDateNull()
方法.这意味着如果要在代码中使用可空类型,则必须执行以下操作:
DateTime? myDateTime = myRow.IsMyDateNull() ? null : (DateTime?) row.MyDate;
虽然这并没有完全打败使用类型化数据集的目的,但它真的很糟糕.令人沮丧的是,类型化数据集以一种比System.Data
扩展方法更不可用的方式实现可空列.
特别糟糕,因为类型化数据集在某些地方确实使用了可空类型 - 例如,Add
包含上述可为空的DateTime列的表的方法将采用DateTime?
参数.
很久以前,我在MSDN论坛上询问了这个问题,最终ADO项目经理解释说可空类型与类型化数据集同时实现,他的团队没有时间通过.NET完全集成这两个类型. 2.0的发货日期.据我所知,从那时起,他们还没有为打字数据集添加新功能.