C# output子句在c中返回值,但executescalar返回null#

C# output子句在c中返回值,但executescalar返回null#,c#,sql-server,executescalar,C#,Sql Server,Executescalar,我需要获取更新的行的第一列值。但是,当我运行queryupdateclaimdetails时,将sStatus='False'输出inserted.slno设置为slno,其中inVoiceNo='*****'和sStatus='True' 在ManagementStudio中,它返回正确的值。但是当我尝试使用Executescalar()获取值时,它返回null 我的代码: bool isupdated = false; int modified=0; try


我需要获取更新的行的第一列值。但是,当我运行query
updateclaimdetails时,将sStatus='False'输出inserted.slno设置为slno,其中inVoiceNo='*****'和sStatus='True'

在ManagementStudio中,它返回正确的值。但是当我尝试使用
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()时
它给了我一个异常错误,所以我使用了
对象

唯一一次
ExecuteScalar
返回
null
是在没有返回行的情况下。如果返回一行且值为
null
,则返回
DbNull.value

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

  • 数据库中的区分大小写
  • unicode与ascii/代码页值
  • char vs varchar,nchar vs nvarchar
  • 运行错误的数据

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

我认为您可以按如下方式重构代码以获得所需的结果

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

如果有人想要更新时的实际记录数,而不仅仅是处理空值,,
在存储过程中,我们的DB developer setreturn@@ROWCOUNT[typo]改为SELECT@@ROWCOUNT

“它给了我一个异常错误”它给了你什么异常?我在Management Studio中运行了相同的查询,它给了我正确的结果ie`44019'哪个是right@mark所以现在需要调试它。忘记所有你认为你知道的关于参数值和数据库状态的信息——事实上,忘记你认为你在和哪个数据库说话。检查一切