2012-08-13 7 views
0
c = new TableCell(); 
decimal pembayaran = Db.SingleDecimal("Select (valuta) from ArInvoice where customerID='01'); 
c.Text = Cf.Num(pembayaran); 
c.Attributes["style"] = "text-align: right;"; 
tr.Cells.Add(c); 

это работает, когда запрос имеет значение, но она содержит эту ошибку, если результат нулевой «Объект не может быть отлит из DBNull к другим типам»Как обрабатывать null исключение в Db.SingleDecimal?

Как решить эту проблему?

+1

Какой инструмент/библиотека это метод «SingleDecimal»? Это твоя собственная? или...? 'Потому что изменение должно быть сделано там. –

ответ

0

Проблема с методом следующего вызова:

Db.SingleDecimal("Select (valuta) from ArInvoice where customerID='01'); 

Не уверен, что это именно так как определение метода не предусмотрено в этом вопросе, но я предполагаю, что он пытается преобразовать значение DBNull в другой тип. Вы должны показать точное определение этого метода для лучшей помощи, но вы бы вообще обрабатывать DBNull с чем-то вроде этого:

var myDecimal = dr.IsDBNull(0) ? 0M : dr.GetDecimal(0); // get a decimal from the first column 
0

Я не являюсь непосредственно знаком с любым инструментом с методом SingleDecimal, так что я В ответ на общий смысл:

При запросе данных из ADO.NET (прямо или косвенно), вполне вероятно, что (возможно, оба) вы получите какой-то «читающий» API (скорее всего, IDataReader), или что вы получите необработанные значения object.

В первом случае у вас должен быть доступ к методу IsDBNull (за столбец); поэтому вызовите этот метод и сделайте все, что хотите, с помощью NULL.

Во втором случае вы должны проверить значение для DBNull, то есть if(val is DBNull).

В обоих случаях то, что делает код, соответствует библиотеке. В обоих случаях вам, возможно, стоит подумать о два сценарии нуль-esque здесь: нет строк и строки с одним значением.

Откровенно говоря, в обоих случаях было бы проще использовать библиотеку/инструмент, который имеет существующую поддержку для этого. Например, с Dapper, это было бы просто:

string customerId = "01"; 
decimal? pembayaran = Db.Query<decimal?>(
    "Select valuta from ArInvoice where [email protected]", 
    new { customerId }).Single(); 

, который дает вам:

  • правильной параметризацию
  • обработка
  • тому же API для запроса всех данных нуля (Query<T>)
  • Возможность использования любых LINQ, которые вам нравятся для обычной (Single(), First(), ToList() и т. Д.)

Если вы хотите использовать значение по умолчанию (а не пустой decimal?, когда значение ячейки было null, вы могли бы просто использовать:

decimal pembayaran = Db.Query<decimal?>(
    "Select valuta from ArInvoice where [email protected]", 
    new { customerId }).Single() ?? 0M; 

здесь обратите внимание на ?? 0M только нуль-сливающихся операция получить ноль decimal вместо null.

0

Я нашел ответ на свой вопрос, хе-хе.Я использую select isnull ((valuta), 0) в sql, поэтому он заменит на 0, когда результат будет DbNull.

decimal pembayaran = Db.SingleDecimal("Select isnull((valuta),0) from ArInvoice where customerID='01'); 

Но если вы хотите, чтобы принять какое-то действие, когда результат DBNull (не только установить значение по умолчанию), может быть, и можно попробовать Эрна Ersönmez-й или ответ Марка Gravell в. Happy Code: D

Смежные вопросы