Исключительная ситуация при попытке разыграть пустое значение - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть запрос, где я получаю информацию из базы данных в DataTable:

DataTable estimateCalculation = new DataTable();

estimateCalculation = db.ExeSQLEstimate("usp_Contracted_Calculation", param1, param2);

Так что теперь я получаю значения как:

 var averageContractedAmount = (from DataRow dr in estimateCalculation.Rows select (decimal)dr["AverageContractedAmount"]).FirstOrDefault().ToString("C");

Но в некоторых случаях dr может быть пустым, поэтому возникает исключение

System.InvalidCastException: 'указанное преобразование недопустимо

Как я могу проверить, если dr возвращает ноль, чтобы не пытаться преобразовать его в десятичную?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

У вас есть в основном 3 варианта для проверки нуля:

  1. Звоните DataRow.IsNull():

    var row = (from DataRow dr in estimateCalculation.Rows select dr).FirstOrDefault();
    
    if (row != null && !row.IsNull("AverageContractedAmount"))
    {
        var averageContractedAmount = ((decimal)row["AverageContractedAmount"]).ToString("C");
    }
    
  2. Сравните значение с DbNull.Value. Обратите внимание, что когда столбец в базе данных содержит ноль, DataRow["ColumnName"] не возвращает null, а возвращает DbNull.Value.

    var value = (from DataRow dr in estimateCalculation.Rows select dr["AverageContractedAmount"]).FirstOrDefault();
    
    if (value != null && value != DBNull.Value)
    {
        var averageContractedAmount = ((decimal)value).ToString("C");
    }
    
  3. Выполнение во время выполнения проверка типа значения. Это особенно хорошо при использовании с синтаксисом сопоставления с шаблоном C # 7.0:

    if ((from DataRow dr in estimateCalculation.Rows select dr["AverageContractedAmount"]).FirstOrDefault() is decimal value)
    {
        var averageContractedAmount = value.ToString("C");
    }
    

Иногда вы не хотите делать if-else ветвление и просто хотите преобразовать значение в обнуляемый тип, как правило, используя троичный условный оператор:

var averageContractedAmount = 
    (from DataRow dr in estimateCalculation.Rows
     select (dr.IsNull("Price")
                ? null
                : (decimal?)dr["AverageContractedAmount"])
    ).FirstOrDefault()
    ?.ToString("C");
0 голосов
/ 12 сентября 2018

Я думаю, вам нужно что-то простое, как это.Если я не понял, пожалуйста, уточните.(Также добро пожаловать)

DataTable dt = new DataTable();
if (dt.Rows.Count == 0)
    return;

Также стоит посмотреть DataRow.IsNull ()

if (!dataRow.IsNull()); 

Я сам этим не пользовался, но похоже на этоможет быть идеальным для того, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...