如何根据 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*/
您永远不会使用传入的 bool
、IsHidden
。您总是将 IsHidden
列设置为 1
,而不管您传递给 IsHidden
函数参数的内容是什么。
为了根据 IsHidden
参数将数据库更新为 1
或 0
,您需要根据该参数的值设置 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();
}
}
这是我从 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
现在这样写,sqlQuery2
的值将是:
Update Mytable set IsHidden = 1 where Id = /*the value of the passed in instanceId*/
您永远不会使用传入的 bool
、IsHidden
。您总是将 IsHidden
列设置为 1
,而不管您传递给 IsHidden
函数参数的内容是什么。
为了根据 IsHidden
参数将数据库更新为 1
或 0
,您需要根据该参数的值设置 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();
}
}