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。