C#ADO.NET UPDATE不会更改数据库记录,但仍会返回1个受影响的行

时间:2015-10-21 13:12:02

标签: c# sql-server tsql ado.net

我正在尝试更新表中的值,据我所知,代码没有任何问题。它甚至会返回受影响的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());

        }
    }

1 个答案:

答案 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。