C# ADO.NET UPDATE 不更改数据库记录,但仍然 returns 1 行受影响
C# ADO.NET UPDATE doesn't change database record, but still returns 1 affected row(s)
我正在尝试更新 table 中的值,据我所知,代码没有任何问题。它甚至 returns 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());
}
}
我认为这与您预期的不一样,查询:
UPDATE ContactSet SET @column = @value WHERE Id = @ID
执行时不会对您的参数执行 'string replacement',例如这不会转化为:
UPDATE ContactSet SET MyColumn = 1 WHERE Id = 789
相反,如果您在数据库中找到 Id = @ID.[=13= 的匹配行,您将使用参数 @Value 的值更新 SQL 参数 @Column ]
你得到“1 行受影响”,因为你的更新中有一个匹配的行,但这实际上并没有改变你的联系人集中的任何内容 table。
你可以这样做:
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。
我正在尝试更新 table 中的值,据我所知,代码没有任何问题。它甚至 returns 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());
}
}
我认为这与您预期的不一样,查询:
UPDATE ContactSet SET @column = @value WHERE Id = @ID
执行时不会对您的参数执行 'string replacement',例如这不会转化为:
UPDATE ContactSet SET MyColumn = 1 WHERE Id = 789
相反,如果您在数据库中找到 Id = @ID.[=13= 的匹配行,您将使用参数 @Value 的值更新 SQL 参数 @Column ]
你得到“1 行受影响”,因为你的更新中有一个匹配的行,但这实际上并没有改变你的联系人集中的任何内容 table。
你可以这样做:
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。