在C#中处理DBNull

41

有更好/更清晰的方法来做这件事吗?

int stockvalue = 0;
if (!Convert.IsDBNull(reader["StockValue"]))
    stockvalue = (int)reader["StockValue"];

你还应该考虑扩展方法。以下是提供其他可能方式的几个示例: http://shahanayyub.wordpress.com/2012/10/04/best-practice-to-check-for-dbnull-using-net/ - NeverHopeless
13个回答

0

我在我的项目中有以下两个扩展方法:

    public static T GetValueSafe<T>(this IDataReader dataReader, string columnName, Func<IDataReader, int, T> valueExtractor)
        where T : class 
    {
        T value;
        if (dataReader.TryGetValueSafe(columnName, valueExtractor, out value))
        {
            return value;
        }

        return null;
    }

    public static bool TryGetValueSafe<T>(this IDataReader dataReader, string columnName, Func<IDataReader, int, T> valueExtractor, out T value)
    {
        int ordinal = dataReader.GetOrdinal(columnName);

        if (!dataReader.IsDBNull(ordinal))
        {
            // Get value.
            value = valueExtractor.Invoke(dataReader, ordinal);

            return true;
        }

        value = default(T);
        return false;
    }

使用方法可以如下:

string companyName = dataReader.GetValueSafe("CompanyName", (reader, ordinal) => reader.GetString(ordinal));

1
有趣但非常冗长,我曾在与DataReaders密切合作时创建了一个类似于这个的类,但我让它更加简洁,使其操作为reader.Get<int>("ReaderField")并使用ChangeType方法。 - Chris Marisic
好主意+1,但我认为我的实现会更快一些。 - Andrew Bezzub

0
int? stockValue = reader["StockValue"] == null || reader["StockValue"] == DBNull.Value ? null : (int?)reader["StockValue"];

0

使用Nullable<int>类型...简写为int?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接