Как обращаться со значением DBNull - PullRequest
0 голосов
/ 26 апреля 2018
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.В вышеприведенном случае я не понимаю, что уже применяю проверку явно путем преобразования в объект и сравнения с DBNull и жестким кодом в строку a или b

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018
row["MemberNo"] = g.First().IsMemberNoNull() ? "a" : "b";

Очевидно, существует метод IscolumnnameNull(), который можно вызвать для обработки значения DBNull?

0 голосов
/ 26 апреля 2018

Я создал универсальный метод для получения значения и обработки 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"; 
0 голосов
/ 26 апреля 2018

Проблема в том, что MemberNo может быть нулевым.Тогда вы не сможете использовать результат First (), без нулевой проверки.Вместо этого используйте g.FirstOrDefault().

var m = g.FirstOrDefault();
row["MemberNo"] = m != null ? "a" : "b";
0 голосов
/ 26 апреля 2018

Вы можете обрабатывать значение DBNull, например:

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