MySQLDataReader, извлекающий проблему нулевого значения в c # - PullRequest
8 голосов
/ 09 августа 2011

В настоящее время я работаю над проектом C #, который будет экспортировать данные MySQL.Экспорт предназначен для любой базы данных на сервере, поэтому я не буду знать, какие поля и типы данных находятся в таблице, и я не буду знать, допускает ли поле в таблице нулевые значения или нет.

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

Я пытался сделать if (reader.getString(field) == null) {}, но он по-прежнему отображает ошибку.

Как мне справиться со значениями Null в базе данных.

Спасибо за любую помощь, вы можетепредоставлять.

Ответы [ 6 ]

20 голосов
/ 09 августа 2011

Вам нужно явно проверить на null в считывателе так:

if (!reader.IsDbNull(field)) {
    var value = reader.GetString(field);
    // ... do stuff here ...
}
4 голосов
/ 16 октября 2012

В этой записи блога есть хороший метод расширения для читателя

Читатель данных SQL - обработка нулевых значений столбца

Я изменил его на интерфейс IDataReader

public static string GetStringSafe(this IDataReader reader, int colIndex)
    {
        return GetStringSafe(reader, colIndex, string.Empty);
    }

    public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue)
    {
        if (!reader.IsDBNull(colIndex))
            return reader.GetString(colIndex);
        else
            return defaultValue;
    }

    public static string GetStringSafe(this IDataReader reader, string indexName)
    {
        return GetStringSafe(reader, reader.GetOrdinal(indexName));
    }

    public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue)
    {
        return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue);
    }
2 голосов
/ 09 августа 2011

.Net не использует литерал null для различения нулей базы данных.Я могу только строить догадки, но я подозреваю, что причина этого в том, что многие распространенные типы столбцов базы данных (int, float и т. Д.) Являются типами значений, и сравнение типа значения с нулем не будет работать совсем так, как вы ожидаете.

Вместо этого проверьте DBNull.Value или используйте функцию .IsDbNull().

1 голос
/ 27 февраля 2015

Вы всегда можете использовать условный оператор c # '?' вот так ...

string val = (reader.IsDBNull(columnIndex)) ? "" : reader.GetString(columnIndex);
1 голос
/ 09 августа 2011

У меня были проблемы с использованием метода GetString () для полей, которые допускают нулевые значения.Я работал над этим, делая что-то вроде:

reader[0].ToString()

0 голосов
/ 11 января 2013

Вы можете сравнить объект, который извлекается из поля NULL, с DBNull.Value .

...