2017-05-27 70 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現在你需要調試它。忘掉你認爲你瞭解的所有參數值和數據庫狀態的一切 - 事實上,你認爲你正在與哪個數據庫交談。檢查*一切* –