我目前正在做一个c#项目,将导出MySQL数据。导出适用于服务器内的任何数据库,因此我不知道表中的字段和数据类型,也不知道表中的字段是否允许空值。
在测试期间,我发现导出工作正常,但如果字段允许空,当mysql数据阅读器去到空行,它显示一个错误SqlNullValueException,数据为空。
我已经尝试做if (reader.getString(field) == null) {}
,但它仍然显示错误。
如何处理数据库中的Null值
谢谢你能提供的任何帮助。
您需要在reader中显式测试null,因此:
if (!reader.IsDbNull(field)) {
var value = reader.GetString(field);
// ... do stuff here ...
}
在这篇博文中有一个很好的读者扩展方法
SQL Data Reader -处理空列值
我把它改成了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);
}
。Net不使用null
字面值来区分数据库空值。我只能推测,但我怀疑这样做的原因是许多常见的数据库列类型(int, float等)是值类型,并且将值类型与null进行比较根本不会像您期望的那样工作。
请检查DBNull.Value
或使用.IsDbNull()
功能。
我在允许空值的字段上使用GetString()方法时遇到了问题。我通过这样做来解决这个问题:
reader[0].ToString()
你总是可以使用c#条件运算符'?"like so…"
string val = (reader.IsDBNull(columnIndex)) ? "" : reader.GetString(columnIndex);
您可以将从NULL字段中检索到的对象与DBNull.Value进行比较。
扩展@Summer-Time答案以包含int columns:
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);
}
}
}