如何处理DBNull值

时间:2018-04-26 03:53:01

标签: c# datatable dataset dbnull

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();

我有以上代码抛出异常,因为MemberNo DBNull customDT a。在上面的例子中,我不明白已经通过转换为对象并与DBNull进行比较来明确应用检查,并硬编码为字符串b或{{1}}

4 个答案:

答案 0 :(得分:0)

您可以处理DBNull值,如下所示:

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

答案 1 :(得分:0)

我创建了通用方法来获取值并处理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"; 

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

row["MemberNo"] = g.First().IsMemberNoNull() ? "a" : "b";

显然可以调用IscolumnnameNull()方法来处理DBNull值吗?