2017-05-27 66 views
2


我需要获取更新的行的第一列值。但是,当我在Management Studio中运行查询Update ClaimDetails set sStatus='False' OUTPUT inserted.slno as Slno where inVoiceNo='******' and sStatus='True'
时,它会返回正确的值。但是,当我尝试使用Executescalar()值返回得到空输出子句返回值,但执行计数器在C#中返回空值

我的代码:

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

      string updateqry = "Update ClaimDetails set [email protected] OUTPUT inserted.slno as Slno where [email protected] 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

+0

“它给了我一个异常错误”它给你什么例外? –

回答

1

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

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

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

伟大的作品,谢谢 – mark

1

唯一一次ExecuteScalar返回null是if 没有行返回。如果返回一行并且值null,则返回DbNull.Value

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

  • 大小写
  • 的Unicode VS ASCII /代码页值
  • 焦炭VS VARCHAR,NCHAR VS nvarchar的
  • 对错误的数据运行
+0

我在Management Studio中运行了相同的查询,它给了我正确的结果ie; '44019'这是正确的 – mark

+0

@mark现在你需要调试它。忘掉你认为你了解的所有参数值和数据库状态的一切 - 事实上,你认为你正在与哪个数据库交谈。检查*一切* –