Приведение нулевого значения


Я пытаюсь заполнить объект класса значениями из таблицы базы данных. Поле someObject.Property является типом int, допускающим значение null.

someObject.Property = Convert.ToInt32(dbReader["SomeField"]);

Итак, если SomeField есть null, Convert даст ошибку DBNull. Есть ли конкретный метод, который я должен использовать для этого?

8 5

8 ответов:

Это должно сработать...

someObject.Property = dbReader["SomeField"].Equals(DBNull.Value)
    ? null
    : (Int32)dbReader["SomeField"];

@John - Хороший улов. Отредактируйте, чтобы отразить эту оплошность.

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

public T ParseValue<T>(System.Data.SqlClient.SqlDataReader reader, string column)
{
     T result = default(T);
     int index = reader.GetOrdinal(column);
     if (!reader.IsDBNull(index))
         result = (T)reader.GetValue(index);

     return result;
}

Я использую это, заменяя 0 любым значением по умолчанию. Если свойство nullable , то по умолчанию используется C# null.

someObject.Property = (DBNull.Value.Equals(dbReader["SomeField"])) ? 0 : Convert.ToInt32(dbReader["SomeField"]);

Есть TryParse

Http://msdn.microsoft.com/en-us/library/f02979c7.aspx

Вы также можете посмотреть на использование оператора null coalescing ??, чтобы дать значение по умолчанию, если это необходимо.

Вы могли бы использовать TryParse. Это не будет специально проверять наличие нулей, но это скажет вам, является ли он разборчивым или нет, что, вероятно, то, что вы действительно хотите.

bool result = Int32.TryParse(value, out number);
someObject.Property = Convert.ToInt32(dbReader["SomeField"].ToString()); 
int someFieldIndex = reader.GetOrdinal("SomeField");
someObject.Property = reader.IsDbNull(someFieldIndex) ? null : (Int32?)reader.GetInt32(someFieldIndex);

Вы можете использовать это:

if (reader["SomeField"] != DBNull.Value)
    someObject.Property = reader.GetInt32(dbReader("SomeField"));