использование datareader со значениями dbnull в .net4 - PullRequest
3 голосов
/ 27 февраля 2012

Я слышал, что в платформе 4 есть метод расширения поля, позволяющий получать нулевые значения от устройства чтения данных, без необходимости проходить процесс первого тестирования, если не ноль, то ... и т. Д. Есть информация о методе расширенияздесь ( MSDN ), но я не знаю, как использовать его в коде (я относительно новичок в .net и никогда раньше не использовал методы расширения).Был бы признателен, если кто-нибудь может привести пример.

Это то, что я пытался реализовать, но он возвращает ошибку, когда dbnull возвращается в одном из столбцов.

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

Ответы [ 2 ]

6 голосов
/ 27 февраля 2012

Эти методы расширения относятся к DataRow - т.е. DataTable ... , а не IDataReader (и т. Д.). Вы можете делать то, что вы хотите здесь, с условным условием - IIf в VB или в 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 голос
/ 27 февраля 2012

Чтобы использовать методы расширения 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.Это может вызвать проблемы, если ваш набор строк большой.

...