在.net4中使用带有dbnull值的datareader

时间:2012-02-27 11:22:22

标签: .net field datareader vb.net-2010 dbnull

我听说框架4中有一个字段扩展方法允许一个接收来自datareader的空值,而不必经过第一次测试的过程,如果不是null那么......等等。有关于扩展方法的信息这里(MSDN),但我不知道如何在代码中使用它(对于.net来说相对较新,之前从未使用过扩展方法)。如果有人能举一个例子,我将不胜感激。

这是我试图实现的,但是当在任一列中返回dbnull时它会返回错误。

Reader.Read()
Dim Val As Nullable(Of Double) = Reader.GetDecimal(0)
Dim Vol As Nullable(Of Long) = Reader.GetInt32(1)

2 个答案:

答案 0 :(得分:6)

这些扩展方法与DataRow相关 - 即DataTable ... IDataReader(等)。 你可以使用条件来做你想要的事情,但是在VB中使用IIf或在C#中:

double? val = reader.IsDBNull(index) ? (double?) null : reader.GetDouble(index);
long? vol = reader.IsDBNull(index) ? (long?)null : reader.GetInt64(index);

您当然可以将它们作为实用程序方法包装起来,也许就像IDataReader上的自定义扩展方法一样:

public static class DataReaderExtensions
{
    public static int? ReadNullableInt32(this IDataReader reader, int index)
    {
        return reader.IsDBNull(index) ? (int?)null : reader.GetInt32(index);
    }
    public static long? ReadNullableInt64(this IDataReader reader, int index)
    {
        return reader.IsDBNull(index) ? (long?)null : reader.GetInt64(index);
    }
    public static double? ReadNullableDouble(this IDataReader reader, int index)
    {
        return reader.IsDBNull(index) ? (double?)null : reader.GetDouble(index);
    }
    public static string ReadNullableString(this IDataReader reader, int index)
    {
        return reader.IsDBNull(index) ? null : reader.GetString(index);
    }
    // etc
}

(抱歉使用c#作为示例 - 但你可以阅读c#,而不是我可以写准确 vb.net)

答案 1 :(得分:1)

要使用DataRow扩展程序,您需要DataRowDataReader上没有方法,所以您需要做的是将阅读器加载到DataTable(在C#中):

var table = new DataTable();
table.Load(reader);

foreach(DataRow row in table.Rows)
{
    var value = row.Field<Decimal>(0);
}

重要的是要意识到这在逻辑上不等同于使用DataReader.Read()方法,因为当您将整个读取器加载到DataTable时,它将把整个读取器加载到内存中。如果您的行集很大,这可能会导致问题。