2009-03-16 3 views
4

У меня есть набор данных, возвращаемый хранимой процедурой, и один из элементов в ней потенциально может быть нулевым. Я пытаюсь преобразовать каждую строку в наборе данных к строго типизированному объекту, но я не могу, похоже, правильно присвоить нулевое значение.Как правильно передать элемент в DataSet, когда он потенциально может быть пустым?

Я создал макет из моего сценария следующим образом:

DataSet ds = new DataSet(); 
ds.Tables.Add(new DataTable()); 
ds.Tables[0].Columns.Add("Name", typeof(string)); 
ds.Tables[0].Columns.Add("Amount", typeof(decimal)); 
ds.Tables[0].Rows.Add("My Name Here", null); //create row with a null item 

DataRow dataRow = ds.Tables[0].Rows[0]; 

Person p = new Person 
{ 
    Name = (string)dataRow["Name"], 
    Amount = (decimal)dataRow["Amount"] 
} 

К сожалению, я получаю следующее исключение: (? Десятичный) System.InvalidCastException: Specified cast is not valid.

Если я пытаюсь использовать обнуляемый тип Я получаю эту ошибку: System.NotSupportedException: DataSet does not support System.Nullable<>.

в отладчике я сделал следующие тесты на значение в DataRow [ «Amount»]:

dataRow["Amount"] is decimal (false) 
dataRow["Amount"] is decimal? (false) 
dataRow["Amount"] == null (false) 
dataRow["Amount"] is object (true) 

Все, что я могу установить, это то, что это какой-то объект ... который не особенно полезен.

Может ли кто-нибудь из вас определить, что я делаю неправильно?

ответ

6

Вы можете использовать dataRow.IsNull("Amount") или Convert.IsDBNull(dataRow["Amount"]) или (dataRow["Amount"] as Decimal) != null.

+0

Спасибо за это! Я не понимал, что он возвращает DBNull. – mezoid

+1

Вы не можете сделать 'dataRow [" Amount "] как Decimal'. Десятичные числа являются типами значений, поэтому никогда не могут быть нулевыми, и они не могут использоваться с 'as'. 'dataRow [" Amount "] - Decimal' будет эквивалентным вариантом. –

+0

Сделайте это: '(dataRow [" Amount "] как десятичное?)! = Null' – bahramzy

1

Вы также можете сделать чек на Null возвращается в базу данных, как:

if (dataRow["Amount"] is System.DBNull.Value) 

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

1

Вы пытались использовать decimal.TryParse?

Как и в:

decimal result; 

if (decimal.TryParse(dataRow["Amount"].ToString(), out result)) 
{ 
//do something 
}