Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何处理DBNull值_C#_Datatable_Dataset_Dbnull - Fatal编程技术网

C# 如何处理DBNull值

C# 如何处理DBNull值,c#,datatable,dataset,dbnull,C#,Datatable,Dataset,Dbnull,我有上面引发异常的代码,因为MemberNo在customDT中是DBNull。在上述情况下,我不认为已经通过转换为object并与DBNull进行比较来显式地应用检查,而将硬代码转换为stringa或b您可以这样处理DBNull值: dataGrid.DataSource = customDS.customDT.AsEnumerable() .GroupBy(r => r.Field("someID"))

我有上面引发异常的代码,因为
MemberNo
customDT
中是
DBNull
。在上述情况下,我不认为已经通过转换为object并与DBNull进行比较来显式地应用检查,而将硬代码转换为string
a
b

您可以这样处理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();

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

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

问题是MemberNo不能为null。 如果没有空检查,则不能使用First()的结果。 相反,请使用
g.FirstOrDefault()


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

g.First()有什么问题。MemberNo==null?您确切地得到了什么异常?您确定
g.First()
有属性
MemberNo
。如果
customDT
的类型是
DataTable
那么
g.First()
应该是
DataRow
你能试一下我的答案吗?我想
g.First().Field(“MemberNo”)==null?“a”:“b”
。DataRow
.Field(columnName)
将返回
null
如果Field包含
DbNull
它的group by子句,并且第一个应该在那里…否则将没有group另一个点是它在DataRow上的group by,这意味着第一个()的返回值将是DataRow这已经存在:
DataRow.Field(“columnName”);)@Fabio-不明白吗?如果表中不存在columnName,我宁愿抛出异常,然后将其隐藏在默认值后面。@Fabio-这是基于要求的,在我的代码中有sp,如果pass getall=1,它将返回表中的所有列,如果pass getall=0,它将不返回部分列,我有获取数据的通用代码,所以我需要它,如果不需要OP删除该部分,在
g.First()中没有什么大不了的。字段(“MemberNo”)
将返回null
DateTime
,如果字段包含
DbNull.value
 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"; 
var m = g.FirstOrDefault();
row["MemberNo"] = m != null ? "a" : "b";
row["MemberNo"] = g.First().IsMemberNoNull() ? "a" : "b";