如何更新本地SQL Server数据库中的值
问题描述:
在我的程序中,我希望用户可以选择更改我创建的本地数据库中的值(在我的示例中为价格)。如何更新本地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
改变他的价格 - 这就是我想要的 - 但它不会改变。
答
编写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
查询是否可以在SSMS中直接运行? – ChrisF
你的表/列名是真的'DBTable'和'ParamToCheck'吗? 此外:如果价格不是varchar/nvarchar,则将值放在引号中是没有意义的。 – Marco
ExecuteNonQuery返回查询更新的行数。你的消息框“保存好”并没有告诉你事实。用_int rowsUpdated = cm.ExecuteNonQuery(); _检查并查看rowsUpdated的值。 – Steve