检查datareader的string列中的Null值

时间:2014-05-13 13:51:09

标签: .net ado.net

我想为返回字符串的“ProductState”列处理空值。 但 isDBNull 仅接受整数参数。请问这里需要改变什么?

string _productState = "";    

if (!dr.IsDBNull("ProductState"))
                    _productState= dr.GetString("ProductState");
                else
                    _productState= "";

5 个答案:

答案 0 :(得分:3)

SqlDataReader.GetOrdinal是您的答案

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();
}