繁体   English   中英

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

[英]C# and SQL Server 2008 : how to handle null from database

我从数据库中选择按日期分组的max(id) 有时可能存在date没有任何ID的情况。 那个时候它上升错误,所以如何处理它分配给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();

如果值是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_nonull的 int)。 我还更改了其他一些内容:

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

我使用了inline-if语法来设置block_no ,但是如果您愿意,也可以使用标准:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM