我正在尝试更新表中的值,据我所知,代码没有任何问题。它甚至会返回受影响的1行,但是当我查看数据库时,记录没有改变。我很感激您提供的任何帮助。
public void UpdateContactInDB(int IDtoUpdate, string editedColumn, string value)
{
using (connection)
{
SqlCommand command = new SqlCommand("UPDATE ContactSet SET @column = @value WHERE Id = @ID", connection);
command.Parameters.AddWithValue("@column", editedColumn);
command.Parameters.AddWithValue("@value", value);
command.Parameters.AddWithValue("@ID", IDtoUpdate);
connection.Open();
int rowsaffected = command.ExecuteNonQuery();
MessageBox.Show("Rows affected: " + rowsaffected.ToString());
}
}
答案 0 :(得分:0)
我认为这不会影响您的预期,查询:
UPDATE ContactSet SET @column = @value WHERE Id = @ID
执行时不会对您的参数进行“字符串替换”,例如这不会转化为:
UPDATE ContactSet SET MyColumn = 1 WHERE Id = 789
相反,如果在数据库中找到Id = @ID的匹配行,则使用参数@Value的值更新SQL参数@Column。
由于您的更新中存在匹配的行,因此“受到1行影响”,但这实际上并未改变您的contactset表中的任何内容。
你可以这样做:
public void UpdateContactInDB(int IDtoUpdate, string editedColumn, string value)
{
using (connection)
{
SqlCommand command = new SqlCommand(string.format(
"UPDATE ContactSet SET {0} = @value WHERE Id = @ID",
editedColumn), connection);
command.Parameters.AddWithValue("@value", value);
command.Parameters.AddWithValue("@ID", IDtoUpdate);
connection.Open();
int rowsaffected = command.ExecuteNonQuery();
MessageBox.Show("Rows affected: " + rowsaffected.ToString());
}
}
但是,您需要注意editedColumn中的字符串值来自哪里,因为这将对SQL注入开放。
最好还是有一个更新,它将更新你需要更改的任何列,设置所有适当的参数,你根本不需要动态SQL。