如何在sqldatareader中获取空值

时间:2013-07-07 03:59:27

标签: c# sql-server ado.net

我从表中获取一行,此行的某些字段为null。如何使用SqlDataReader获取这些字段?

//so_type , so_read are null able 

while (reader.Read())
{
    s.id = (Int64)reader["so_id"];
    s.senderid = (Int64)reader["so_senderid"];
    s.body = (string)reader["so_body"];
    s.date = (string)reader["so_date"];
    s.isread = (bool)reader["so_read"];
    s.type = (int)reader["so_type"];
}

2 个答案:

答案 0 :(得分:2)

您可以利用C#泛型编写一个帮助方法,该方法可以为每个可以null的列提取值或默认值。

private static T GetValue<T>(object value)
{
    return value == DBNull.Value ? default(T) : (T) value;
}

while (reader.Read())
{
    s.id       = GetValue<long>(reader["so_id"]);
    s.senderid = GetValue<long>(reader["so_senderid"]);
    s.body     = GetValue<string>(reader["so_body"]);
    s.date     = GetValue<string>(reader["so_date"]);
    s.isread   = GetValue<bool>(reader["so_read"]);
    s.type     = GetValue<int>(reader["so_type"]);
}

这也假定值已经是正确的类型。

更安全的实现方式是:

private static T GetValue<T>(object value)
{
    return value == DBNull.Value
           ? default(T)
           : (T) Convert.ChangeType(value, typeof(T));
}

答案 1 :(得分:1)

您可以使用IsDBNull method。这样的事情:

int ordinal_so_type=reader.GetOrdinal("so_type");
//...
while(reader.Read()==true)
{
  //reading other columns here
  if (reader.IsDBNull(ordinal_so_type)==false)
  {
    s.type=reader.GetInt32(ordinal_so_type);
  }
  else
  {
    //do whatever you like if the so_type column is null
  }
}