10

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

在测试期间,我发现导出工作正常,但是如果当 mysql 数据读取器进入为空的行时该字段允许为空,则会显示错误 SqlNullValueException,数据为空。

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

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

感谢您的任何帮助,您可以提供。

4

6 回答 6

22

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

if (!reader.IsDbNull(field)) {
    var value = reader.GetString(field);
    // ... do stuff here ...
}
于 2011-08-09T15:45:04.477 回答
4

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

SQL 数据阅读器 - 处理 Null 列值

我将其更改为 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);
    }
于 2012-10-16T08:17:33.923 回答
2

.Net 不使用null文字来区分数据库空值。我只能推测,但我怀疑其原因是许多常见的数据库列类型(int、float 等)都是值类型,并且将值类型与 null 进行比较根本不会像您期望的那样工作。

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

于 2011-08-09T15:55:24.603 回答
1

您总是可以使用 c# 条件运算符“?” 像这样...

string val = (reader.IsDBNull(columnIndex)) ? "" : reader.GetString(columnIndex);
于 2015-02-27T00:44:15.280 回答
1

我在允许空值的字段上使用 GetString() 方法时遇到了问题。我通过执行以下操作来解决此问题:

reader[0].ToString()

于 2011-08-09T17:29:36.923 回答
0

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

于 2013-01-11T10:33:11.420 回答