#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"));