2014-08-30 57 views
0

下面的代碼工作,我得到消息框說產品已更新,但沒有更改數據庫中。C#executenonquery不更新數據庫

這是從另一個在同一數據庫中工作的方法複製並粘貼的,並且該方法正常工作。

private void btnProductSave_Click(object sender, EventArgs e) 
    { 
     if (txtProductName.Text != "") 
     { 
      var confirmResult = MessageBox.Show("Are you sure you want to save changes to this product?", "Confirm Save", MessageBoxButtons.YesNo); 
      if (confirmResult == DialogResult.Yes) 
      { 
       SqlConnection con = null; 
       con = new SqlConnection(ConfigurationManager.ConnectionStrings["PVAdmin.Properties.Settings.PricerConnectionString"].ConnectionString); 
       string sql2 = "UPDATE Products SET productName = @productName WHERE productID = @productID"; 

       SqlCommand myCommand2 = new SqlCommand(sql2, con); 
       myCommand2.Parameters.AddWithValue("@productName", txtProductName.Text); 
       myCommand2.Parameters.AddWithValue("@productID", lblProductID.Text); 

       con.Open(); 
       myCommand2.ExecuteNonQuery(); 
       con.Close(); 

       MessageBox.Show("Product saved."); 
       this.LoadProduct((int)cboProductSelect.SelectedValue); 
      } 
      else 
      { 
       MessageBox.Show("No changes were saved."); 
      } 
     } 
    } 

回答

1

我以前見過這個,它的結果是sql引擎出現自身更新本身。由於你的@parm和列一樣,所以sql會說我更新我。

要解決,儘量SLIGHTLY重新命名的參數,如

UPDATE Products SET productName = @pProductName WHERE productID = @pPproductID"; 
myCommand2.Parameters.AddWithValue("@pProductName", txtProductName.Text); 
myCommand2.Parameters.AddWithValue("@pProductID", lblProductID.Text); 

這樣,SQL沒有列「pProductName」,並將在事實上轉到參數......同樣與「pProductID」 。非常微妙,但可能正是你遇到的。此外,你連接到哪個數據庫。不同的引擎使用不同的令牌字符作爲參數傳遞......「?」,「@」,「:」只是我知道的幾個...

+0

我正在使用Sql Server。我試過這個,但結果是一樣的。這讓我瘋狂,因爲它在另一種方法中工作正常,只是不是這個。 – Katp00p 2014-08-30 19:51:03

+0

@ Katp00p,嘗試添加一個int RowsUpdated = cmd.executenonquery ...然後messagebox rowsUpdated的值。它是否會像預期的那樣返回,或是零記錄。 – DRapp 2014-08-30 19:53:57

+0

我想出了問題......與查詢無關,它是存儲在lblProductID中的值。感謝您的幫助,我會刪除這個問題,以免它將來會讓人們感到困惑。 – Katp00p 2014-08-30 19:56:10