2016-12-04 86 views
1

在我的程序中,我希望用戶可以選擇更改我創建的本地數據庫中的值(在我的示例中爲價格)。如何更新本地SQL Server數據庫中的值

我遇到問題了。連接工作正常,調試良好,甚至顯示「保存好」的消息,但在數據庫中根本不會改變。

private void button2_Click(object sender, EventArgs e) 
{    
    var con = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\sam\Desktop\hello\hello\DB.mdf;Integrated Security=True"; 

    using (SqlConnection myconnection = new SqlConnection(con)) 
    { 
     try 
     { 
      myconnection.Open();  
      var query = string.Format("update DBTable set price='"+textBox2.Text+"' where ParamToCheck='"+comboBox5.Text+"'"); 
      SqlCommand cm = new SqlCommand(query, myconnection); 

      cm.ExecuteNonQuery(); 

      MessageBox.Show("saved ok !!");  
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 

用戶可以選擇從combobox5一個字符串,並輸入數量從textBox2改變他的價格 - 這就是我想要的 - 但它不會改變。

+2

查詢是否可以在SSMS中直接運行? – ChrisF

+0

你的表/列名是真的'DBTable'和'ParamToCheck'嗎? 此外:如果價格不是varchar/nvarchar,則將值放在引號中是沒有意義的。 – Marco

+1

ExecuteNonQuery返回查詢更新的行數。你的消息框「保存好」並沒有告訴你事實。用_int rowsUpdated = cm.ExecuteNonQuery(); _檢查並查看rowsUpdated的值。 – Steve

回答

2

編寫SQL查詢的正確方法是通過使用參數併爲每列使用正確的數據類型。像現在這樣串聯字符串是一種安全的方法,可以分解爲許多類型的錯誤。簡單的問題是數據庫引擎無法正確理解您的值。最糟糕的一個叫做SQL Injection,可能會破壞整個數據庫。

var query = "update DBTable set [email protected] where [email protected]"; 
using (SqlConnection myconnection = new SqlConnection(con)) 
using (SqlCommand cm = new SqlCommand(query, myconnection)) 
{ 
    try 
    { 

     myconnection.Open();  
     cm.Parameters.Add("@price", SqlDbType.Decimal).Value = Convert.ToDecimal(textBox2.Text); 
     cm.Parameters.Add("@prm", SqlDbType.NVarChar).Value = comboBox5.Text; 
     int rowsUpdated = cm.ExecuteNonQuery(); 
     if(rowsUpdated > 1) 
      MessageBox.Show("saved ok !!");  
     else 
      MessageBox.Show("No match for condition:" + comboBox5.Text);  
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

注意,我已經簡化了很多你的查詢文本不使用字符串的串聯,而是有將由數據庫引擎來完成你的命令兩個參數佔位符。之後,我添加了兩個特定數據類型的參數(decimal和nvarchar)。這些類型應該與您的列的數據類型相匹配,用於Price和ParamToCheck。

+0

謝謝現在很多工作正常! – shlezz

相關問題