我想为返回字符串的“ProductState”列处理空值。 但 isDBNull 仅接受整数参数。请问这里需要改变什么?
string _productState = "";
if (!dr.IsDBNull("ProductState"))
_productState= dr.GetString("ProductState");
else
_productState= "";
答案 0 :(得分:3)
if (!dr.IsDBNull(dr.GetOrdinal("ProductState")))
您可以编写一个扩展方法来封装此功能
public static class ReaderExtensions
{
public static bool IsDBNull(this SqlDataReader reader, string colName)
{
return reader.IsDBNull(reader.GetOrdinal(colName));
}
}
现在你可以调用IsDBNull传递一个字符串
if (!dr.IsDBNull("ProductState"))
查看代码(reader.GetString("ProductState"))
我认为您正在使用MySql提供程序,该提供程序提供以列名作为参数的扩展GetString
(和其他GetXXXX)。但是如果你有一个SqlDataReader,那么你需要使用GetOrdinal(或其他扩展)更改该调用,因为SqlClient没有带有列名作为参数的GetString
答案 1 :(得分:2)
试试这个:
if (!dr.IsDBNull(dr.GetOrdinal("ProductState")))
答案 2 :(得分:1)
您可以将其与DBNull.Value
比较
if(dr["ProductState"] != DBNull.Value)
答案 3 :(得分:1)
我使用这个快速提示:
如果字段包含as
,则使用DBNull.Value
进行投射会返回null。
if (dr["ProductState"] as string == null)
{
...
}
此外,如果字段包含??
DBNull.Value
运算符直接在一行中获取后备值
var productState = dr["ProductState"] as string ?? "";
答案 4 :(得分:0)
我们有一组扩展方法,可以对所有列类型或特定类型的扩展进行一般处理,这使得代码可以像原始的DataReader方法一样读取。因此,对于字符串,我们有这两个扩展,它们允许列序号或名称,无论您有权访问:
/// <summary>Checks for null before calling GetString.</summary>
/// <returns>The string value of the column, or null if the column is <see cref="DBNull"/>.</returns>
public static string GetNullableString(this IDataRecord row, int i)
{
object val;
if((val = row.GetValue(i)) == DBNull.Value)
return null;
return val.ToString();
}
/// <summary>Checks for null before calling GetString.</summary>
/// <returns>The string value of the column, or null if the column is <see cref="DBNull"/>.</returns>
public static string GetNullableString(this IDataRecord row, string name)
{
object val;
if((val = row[name]) == DBNull.Value)
return null;
return val.ToString();
}
你可以修改它以接受null的替换值,尽管我们有string
特定于那个而不是DataReader级别的扩展方法...再次,只是为了区分关注:
/// <summary>Checks for null before calling GetString.</summary>
/// <returns>The string value of the column, or <paramref name="defaultVal'/> if the column is <see cref="DBNull"/>.</returns>
public static string GetNullableString(this IDataRecord row, string name, string defaultVal)
{
object val;
if((val = row[name]) == DBNull.Value)
return defaultVal;
return val.ToString();
}