Как правильно привести элемент в DataSet, когда он может быть нулевым? - PullRequest
4 голосов
/ 17 марта 2009

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

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

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)

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

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

Ответы [ 3 ]

6 голосов
/ 17 марта 2009

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

1 голос
/ 17 марта 2009

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

Как в:

decimal result;

if (decimal.TryParse(dataRow["Amount"].ToString(), out result))
{
//do something
}
1 голос
/ 17 марта 2009

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

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

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

...