【问题标题】:MySQLDataReader retrieving Null value problem in c#MySQLDataReader在c#中检索Null值问题
【发布时间】:2011-10-23 08:34:55
【问题描述】:

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

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

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

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

感谢您提供的任何帮助。

【问题讨论】:

    标签: c# mysql mysqldatareader


    【解决方案1】:

    您需要在阅读器中显式测试 null,因此:

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

    【讨论】:

    • 不应该是.IsDbNull(reader["field"]) 吗?还是我错了?
    • 取决于阅读器实现/辅助方法。基本接口 IDataReader 只采用整数列索引是对的。然而,MySqlDataReader 有重载来获取一个字符串字段名称,它只是进行 reader.GetOrdinal 查找。
    【解决方案2】:

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

    改为检查DBNull.Value 或使用.IsDbNull() 函数。

    【讨论】:

      【解决方案3】:

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

      reader[0].ToString()

      【讨论】:

        【解决方案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);
            }
        

        【讨论】:

        • 你说得对,最好是一个扩展而不是所有代码都做同样的事情
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-11
            • 1970-01-01
            • 2017-07-22
            • 2019-10-29
            • 1970-01-01
            • 2016-01-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多