Приведение к нулевому значению

#c# #dbnull

#c# #dbnull

Вопрос:

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. -1: DBNull — это тип, а не значение. Вам нужно сравнить с DBNull.Value . И вам было бы лучше использовать IsDbNull .

Ответ №2:

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

 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 resu<
}
  

Ответ №3:

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

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

Комментарии:

1. Его свойство является an, Int32? поэтому, вероятно null , предпочтительнее. В остальном та же идея. =)

2. Упс, пропустил это в вашем сообщении. Он действительно заявил, что «Поле SomeObject.Property является обнуляемым типом int».

Ответ №4:

Существует TryParse

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

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

Ответ №5:

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

 bool result = Int32.TryParse(value, out number);
  

Ответ №6:

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

Ответ №7:

 int someFieldIndex = reader.GetOrdinal("SomeField");
someObject.Property = reader.IsDbNull(someFieldIndex) ? null : (Int32?)reader.GetInt32(someFieldIndex);
  

Ответ №8:

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

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