MySQLDataReader在c#中检索Null值问题

时间:2011-08-09 15:42:39

标签: c# mysql mysqldatareader

我目前正在开发一个将导出MySQL数据的C#项目。导出是服务器中的任何数据库,所以我不会知道表中的字段和数据类型,我不知道表中的字段是否允许空值。

在测试期间,我发现导出工作正常但是如果字段允许null,当mysql数据读取器到达行为null时,它显示错误SqlNullValueException,data为null。

我尝试过if (reader.getString(field) == null) {},但仍然显示错误。

如何处理数据库中的Null值。

感谢您提供的任何帮助。

6 个答案:

答案 0 :(得分:20)

您需要在阅读器中明确测试null:

if (!reader.IsDbNull(field)) {
    var value = reader.GetString(field);
    // ... do stuff here ...
}

答案 1 :(得分:4)

在这篇博文中,读者有一个很好的扩展方法

SQL Data Reader - handling Null column values

我将其更改为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 :(得分:2)

.Net不使用null字面值来区分数据库空值。我只能推测,但我怀疑这是因为许多常见的数据库列类型(int,float等)都是值类型,将值类型与null进行比较根本无法达到预期效果。

相反,请检查DBNull.Value或使用.IsDbNull()功能。

答案 3 :(得分:1)

我在允许空值的字段上使用GetString()方法时遇到问题。我通过做类似的事情来解决这个问题:

reader[0].ToString()

答案 4 :(得分:1)

你总是可以使用c#条件运算符'?'像这样...

string val = (reader.IsDBNull(columnIndex)) ? "" : reader.GetString(columnIndex);

答案 5 :(得分:0)

您可以将从NULL字段检索的对象与DBNull.Value进行比较。