C#和SQL Server 2008:如何从数据库处理null

时间:2015-02-17 09:06:29

标签: c# sql-server sql-server-2008

我从数据库中选择max(id),按日期分组。有时可能会出现日期没有任何ID的情况。那个时候它上升错误,所以如何处理它n赋值给int变量。

SqlCommand maxid = new SqlCommand("select max(block) from blocks_allocation where date='" + DR.ItemArray.GetValue(7).ToString() + "'", con);

SqlDataReader maxrd = maxid.ExecuteReader();

if (maxrd.Read())
   block_no = int.Parse(maxrd["block"].ToString()) + 1;

maxrd.Close();

2 个答案:

答案 0 :(得分:2)

如果值为null,则

SqlCommand返回DBNull.Value,因此,如果您的查询可以返回空值,则需要先对DBNull.Value进行测试,如下所示:

var date = DR.ItemArray.GetValue(7).ToString();
const string sql = "SELECT MAX(block) FROM blocks_allocation WHERE date = @date";
using (var cmd = new SqlCommand(sql, con))
{
    cmd.Parameters.AddWithValue("@date", date);
    var maxBlock = cmd.ExecuteScalar();
    block_no = maxBlock == DBNull.Value ? null : (int?) maxBlock;
}

(这假设block_nonullable int)。我还改变了一些其他的东西:

  • 如果q查询返回单个值,您可以使用ExecuteScalar代替Read等...
  • 您应该使用using块而不是手动关闭/处置对象。
  • 您不应该构建动态SQL,因为它可以导致SQL Injection - 我已经修改了查询以使用参数化查询。

我已使用inline-if syntax设置block_no,但如果您愿意,也可以使用标准:

if (maxBlock == DBNull.Value)
{
    block_no = null;
}
else
{
    block_no = (int?) maxBlock;
}

答案 1 :(得分:-1)

检查max(id)是否为null,如果是,则使用ISNULL()

返回1
select isnull(max(block),1) from blocks_allocation