MySQLDataReader在C#中检索Null值问题

6mw9ycah  于 2023-06-21  发布在  Mysql
关注(0)|答案(7)|浏览(232)

我目前正在做一个C#项目,将导出MySQL数据。导出是针对服务器中的任何数据库的,因此我不知道表中有哪些字段和数据类型,也不知道表中的字段是否允许空值。
在测试过程中,我发现导出工作正常,但如果字段允许null,当mysql数据读取器到达为null的行时,它会显示错误SqlNullValueException,data is null。
我试过做if (reader.getString(field) == null) {},但它仍然显示错误。
如何科普数据库中的Null值。
谢谢你能提供的任何帮助。

lnxxn5zx

lnxxn5zx1#

你需要在读取器中显式地测试null,所以:

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

iq3niunx2#

在这篇博客文章中有一个很好的扩展方法给读者
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);
    }
qlzsbp2j

qlzsbp2j3#

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

alen0pnh

alen0pnh4#

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

gopyfrb3

gopyfrb35#

你总是可以使用C#条件运算符'?就像这样。。

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

xzlaal3s6#

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

ercv8c1e

ercv8c1e7#

扩展@Summer-Time答案以包含int列:

using System.Data;

namespace MyApp
{

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

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

        public static string GetIntAsStringSafe(this IDataReader reader, int colIndex)
        {
           return GetIntAsStringSafe(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);
        }
    }
}

相关问题