output子句返回value但executecalar在c#中返回null

时间:2017-05-27 12:29:25

标签: c# sql-server executescalar


 我需要获取更新行的第一列值。但是当我运行查询Update ClaimDetails set sStatus='False' OUTPUT inserted.slno as Slno where inVoiceNo='******' and sStatus='True'
在Management Studio中,它返回正确的值。但是当我尝试使用Executescalar()获取值时,它返回null

我的代码:

 bool isupdated = false;
        int modified=0;
        try
        {

            string updateqry = "Update ClaimDetails set sStatus=@sStatus OUTPUT inserted.slno as Slno where inVoiceNo=@inVoiceNo and sStatus='True'";
            SqlCommand cmd = new SqlCommand(updateqry, con);
            cmd.Parameters.AddWithValue("@sStatus", sStatus);
            cmd.Parameters.AddWithValue("@inVoiceNo", inVoiceNo);
            connect();
            if (cmd.ExecuteNonQuery() > 0)
            {
                isupdated = true;
                 //modified = (int)cmd.ExecuteScalar();
                object a = cmd.ExecuteScalar();
                if (a != null)
                    modified = Convert.ToInt32(a);

            }
        }
        catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
        finally { disconnect(); }
        return modified;

当我使用modified = (int)cmd.ExecuteScalar();时,它给了我一个异常错误,因此我使用了object

3 个答案:

答案 0 :(得分:1)

ExecuteScalar返回null的唯一时间是没有返回行。如果返回一行且值 null,则会返回DbNull.Value

所以:没有行匹配。检查@inVoiceNo是什么,以及它是否存在于您正在运行的表中。混淆的常见原因:

  • 数据库中的区分大小写
  • unicode vs ascii / code-page values
  • char vs varchar,nchar vs nvarchar
  • 针对错误的数据运行

答案 1 :(得分:1)

代码执行相同的UPDATE命令两次,一次使用ExecuteNonQuery(丢弃标量结果并返回受影响的行数),再次执行ExecuteScalar。由于WHERE子句中的硬编码'True',当提供的sStatus值为'False'时,同一命令的第二次调用永远不会更新行。在这种情况下,标量结果始终为null

我认为您可以重构以下代码以获得所需的结果。

object a = cmd.ExecuteScalar();
if (a != null)
{
    isupdated = true;
    modified = Convert.ToInt32(a);
}

答案 2 :(得分:0)

如果有人想要更新的实际记录数不仅仅是处理空值, 在存储过程中,我们的数据库开发人员设置了 return @@ ROWCOUNT [typo]而不是 SELECT @@ ROWCOUNT