C# MySQLDataReader在c中检索空值问题#

C# MySQLDataReader在c中检索空值问题#,c#,mysql,mysqldatareader,C#,Mysql,Mysqldatareader,我目前正在从事一个C#项目,该项目将导出MySQL数据。导出针对服务器中的任何数据库,因此我不知道表中的字段和数据类型,也不知道表中的字段是否允许空值 在测试期间,我发现导出工作正常,但是如果当mysql数据读取器到达null行时字段允许null,则会显示一个错误SqlNullValueException,data为null 我尝试过执行if(reader.getString(field)==null){},但它仍然显示错误 如何处理数据库中的空值 谢谢你能提供的帮助 您需要在读卡器中显式测试n

我目前正在从事一个C#项目,该项目将导出MySQL数据。导出针对服务器中的任何数据库,因此我不知道表中的字段和数据类型,也不知道表中的字段是否允许空值

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

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

如何处理数据库中的空值


谢谢你能提供的帮助

您需要在读卡器中显式测试null,以便:

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

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


相反,请检查
DBNull.Value
或使用
.IsDbNull()
函数

我在允许空值的字段上使用GetString()方法时遇到问题。我通过以下方式解决了这个问题:


reader[0].ToString()

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

我将其更改为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);
    }

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

您可以始终使用c#条件运算符“?”,如下所示

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

这不应该是
.IsDbNull(读卡器[“字段])
?还是我错了?取决于阅读器实现/助手方法。基本接口IDataReader只接受整数列索引是正确的。然而,MySqlDataReader有重载来获取字符串字段名,这只是执行reader.GetOrdinal查找。没错,作为一个扩展,它比所有代码都执行相同的操作要好得多