2016-12-04 43 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

相关问题