如何根据 C# 中的用户输入更改 SQL 查询?

How do I change the SQL query on the basis of user input in C#?

这是我从 ui 接收道具的代码,它是我接收的布尔值。从 UI 开始,我正在传递 true 和 false:

public void AlterTableColumn(int instanceid, bool IsHidden)
{
    var sqlQuery2 = String.Format("Update {0} set {1} = 1 where Id = {2};", "Mytable", "IsHidden", instanceid);

    string connString = System.Configuration.ConfigurationManager.AppSettings["DBConnection"].ToString();
    // getConnectionStringById(instanceId.ToString());

    using (SqlConnection connection = new SqlConnection(connString))
    {
        connection.Open();

        SqlCommand sql_cmnd = new SqlCommand(sqlQuery2, connection);
        sql_cmnd.CommandType = CommandType.Text;
        sql_cmnd.CommandTimeout = 10000;

        sql_cmnd.ExecuteNonQuery();

        sql_cmnd.Connection.Close();
    }
}

如何改变上面提到的sqlQuery2的真假?现在它在 SQL table 中为 true 或 false

制作 1

现在这样写,sqlQuery2的值将是:

Update Mytable set IsHidden = 1 where Id = /*the value of the passed in instanceId*/

您永远不会使用传入的 boolIsHidden。您总是将 IsHidden 列设置为 1,而不管您传递给 IsHidden 函数参数的内容是什么。

为了根据 IsHidden 参数将数据库更新为 10,您需要根据该参数的值设置 int。您还需要更新查询本身以使用 int 而不是始终将值设置为 1.

int isHiddenDbValue = IsHidden ? 1 : 0;
var sqlQuery2 = string.Format("Update {0} set IsHidden = {1} where Id = {2}",
   "Mytable", isHiddenDbValue, instanceId);

也就是说,与其使用 string.Format 并将值直接放入查询中,不如像您正在做的那样,您应该使用参数化查询。这将保护您免受 SQL 注入攻击。

例如:

public void AlterTableColumn(int instanceid, bool IsHidden)
{
    int isHiddenDbValue = IsHidden ? 1 : 0;
    var sqlQuery2 = "Update Mytable set IsHidden = @IsHidden where Id = @Id";
    string connString = System.Configuration.ConfigurationManager.AppSettings["DBConnection"].ToString();
    using (SqlConnection connection = new SqlConnection(connString))
    {
        connection.Open();
        SqlCommand sql_cmnd = new SqlCommand(sqlQuery2, connection);
        sql_cmnd.CommandType = CommandType.Text;
        sql_cmnd.CommandTimeout = 10000;
        sql_cmnd.Parameters.AddWithValue("IsHidden", isHiddenDbValue);
        sql_cmnd.Parameters.AddWithValue("Id", instanceId);
        sql_cmnd.ExecuteNonQuery();
        sql_cmnd.Connection.Close();
    }
}