【问题标题】:How to handle DBNull Value如何处理 DBNull 值
【发布时间】:2018-04-26 03:53:00
【问题描述】:
dataGrid.DataSource = customDS.customDT.AsEnumerable()  
                      .GroupBy(r => r.Field("someID"))                  
                      .Select(g => {                      
                          CustomDS.customRow row = customDS.customDT.NewcustomRow();                      
                          row["someID"] = g.Key;                      
                          row["Tradingdate"] = g.First().Tradingdate;                      
                          row["MemberNo"] = ((object)g.First().MemberNo == DBNull.Value) ? "a" : "b";                      
                          row["Amt"] = (decimal?)g.Sum(r => r.Field("Amt"));                      
                          return row;                  
                       }).CopyToDataTable();

我有上面抛出异常的代码,因为MemberNocustomDT 中是DBNull。在上述情况下,我不明白已经通过转换为对象并与 DBNull 进行比较来显式应用检查,并将硬编码为字符串 ab

【问题讨论】:

  • g.First().MemberNo == null 有什么问题?
  • 你到底得到了什么异常?
  • 您确定g.First() 具有属性MemberNo 。如果customDTDataTable 类型,那么g .First() 应该是DataRow
  • 你能试试我的答案吗,我认为这会起作用
  • g.First().Field<string>("MemberNo") == null ? "a" : "b"。 DataRow .Field<string>(columnName) 将返回 null 如果字段包含 DbNull

标签: c# datatable dataset dbnull


【解决方案1】:

您可以像这样处理 DBNull 值:

row["CancelledDate"] == DBNull.Value ? (DateTime?)null : 
                          Convert.ToDateTime(row["CancelledDate"]);

【讨论】:

    【解决方案2】:

    问题是 MemberNo 可以为空。 那么你不能使用 First() 的结果,没有空检查。 请改用g.FirstOrDefault()

    var m = g.FirstOrDefault();
    row["MemberNo"] = m != null ? "a" : "b";
    

    【讨论】:

    • 它按子句分组,首先应该在那里......否则将没有组
    • 还有一点是它在datarow上的group by,也就是说First()的返回值会是datarow
    【解决方案3】:

    我创建了获取值和处理DBNull 场景的通用方法

     public static T GetColumnValue<T>(string columnName, DataRow dr)
     {
        Type typeParameterType = typeof(T);
    
        //dr.Table.Columns.Contains(columnName)
        //this line can be removed if you are sure you are going to get columns 
        //it all depends on requirement and preference
        return dr.Table.Columns.Contains(columnName) && dr[columnName] != DBNull.Value
                    ? (T) Convert.ChangeType(dr[columnName] , typeParameterType)
                    : default(T);
     }
    

    你就这样试试

     row["MemberNo"] = string.IsNullOrEmpty(GetColumnValue("MemberNo", g.First())) 
                                                                   ? "a" : "b"; 
    

    【讨论】:

    • 这已经存在:DataRow.Field&lt;DateTime?&gt;("columnName"); ;)
    • @Fabio - 没有得到你?
    • 如果表中不存在columnName,我更喜欢抛出异常,然后将其隐藏在默认值后面。
    • @Fabio - 这是基于要求的,在我的代码中我有 sp 如果通过 getall=1 它将返回表中的所有列,如果通过 getall=0 则它不返回某些列,并且我有用于获取数据的通用代码,所以我需要它,如果不需要 OP 删除该部分,那没什么大不了的
    • g.First().Field&lt;DateTime?&gt;("MemberNo") 将返回可为空的DateTime,如果字段包含DbNull.Value,则有值或没有值
    【解决方案4】:
    row["MemberNo"] = g.First().IsMemberNoNull() ? "a" : "b";
    

    显然有一个IscolumnnameNull()方法可以被调用来处理DBNull的值?

    【讨论】:

      猜你喜欢
      • 2023-04-02
      • 2017-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 2023-03-09
      • 2011-01-26
      相关资源
      最近更新 更多