代码之家  ›  专栏  ›  技术社区  ›  Amy

表是可以为空的日期时间,但数据集引发异常?

  •  20
  • Amy  · 技术社区  · 15 年前

    我正试图使用数据集设计器从查询创建数据表。我把这个拿下来就行了。使用的查询从数据库返回可为空的datetime列。但是,当涉及到这个代码时:

    DataSet1.DataTable1DataTable table = adapter.GetData();
    

    这会引发一个强类型的异常:

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

    如何使用设计器允许此列可以为空?

    8 回复  |  直到 6 年前
        1
  •  40
  •   evodev    12 年前

    类型化数据集不支持可为空的类型。它们支持可以为空的 .

    类型化数据集生成器创建不可为空的属性和处理空值的相关方法。如果创建一个 MyDate 类型列 DateTime AllowDbNull 设置为 true , the DataRow 子类将实现不可为空的 日期时间 属性命名 米德尔 A SetMyDateNull() 方法和 IsMyDateNull() 方法。这意味着,如果要在代码中使用可为空的类型,则必须执行以下操作:

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

    虽然这不是 完全地 破坏了使用类型化数据集的目的,这真的很糟糕。类型化数据集以比 System.Data 例如,扩展方法。

    尤其糟糕,因为类型化数据集 在某些地方使用可以为空的类型-例如, Add<TableName>Row() 包含上述可空日期时间列的表的方法将采用 DateTime? 参数。

    很久以前,我在msdn论坛上问过这个问题,最终ADO项目经理解释说,可以为空的类型与类型化的数据集同时实现,而且他的团队没有时间在.NET 2.0的发货日期之前完全集成这两个类型。据我所知,从那时起,他们就没有向类型化数据集添加新功能。

        2
  •  1
  •   Rajesh    12 年前

    谢谢,这解决了我的类似问题:这是代码。 在这个问题的情况下

    Isevent_start_date()
    

    返回字段是否为空。

    在我的例子中:我遇到了类似的问题,我使用了以下解决方案

                //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);
    
                }
    
        3
  •  1
  •   Gonzalo.-    12 年前

    似乎是 Designer 为该列获取的数据库类型错误。

    打开 xsd Designer 击中 F4 得到 Properties Window 打开。选择适当的列并设置 Nullable (或者类似的,不记得确切的名字)是真的。

        4
  •  1
  •   Jack D Menendez    11 年前

    要使用Linq,必须转到DataSet.xsd中的Tables属性。首先检查并确保列确实设置为可以为空。然后,您必须查看列的特定属性“NullValue”。空值默认为“exception”,至少在vs 2012中是这样。对于vb,将其设置为Nothing,这样就可以在linq where子句中执行“isnothing”。

        5
  •  1
  •   Fawzy Mokhtar    6 年前

    我这样做是为了插入值 NULL 在一个 DateTime 列,

    假设我有一个 nullable DateTime 在数据库的列中,我在一个名为 response 我想插入 可为空的日期时间 数据集列中调用的值 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);
    
        6
  •  -1
  •   Aaron    15 年前

    System.DateTime对象不可为空。要使日期时间为空,是否将其设置为日期时间?(放一个?日期之后)

    DateTime? nullableDateTime = null;
    
        7
  •  -1
  •   Tequila    12 年前

    我正在使用下面列出的代码处理Excel工作表中的空单元格,该工作表将被读入数据表。

    if (!reader.IsDBNull(0))                                
    {                                    
      row["DateOnCall"] = (DateTime)reader[0];
    }
    
        8
  •  -1
  •   Onur Öçalan    8 年前

    它似乎与DataTable和强类型DataTable不同…像这样使用。

    DataSet1.DataTable1DataTable table = new DataSet1.DataTable1DataTable();
    table.Merge(adapter.GetData().CopyToDataTable());