我还能使用 sql 命令的参数吗?
Can I still use parameters for sql command?
我正在尝试编写用于构建 Insert/Update 查询的通用代码。到目前为止,我只创建了更新查询,但考虑到 SQL 注入我有疑问。
我的主要目标是尝试创建代码以减少一遍又一遍地重新键入相同代码的时间。
public SqlConnection SqlConn;
private SqlCommand SqlComm;
public void UpdateRow(string TableName, string UpdateCondition, List<KeyValuePair<string, string>> FieldAndValueList)
{
SqlOpen();
try
{
string UpdateString = $"UPDATE {TableName} ";
int counter = 0;
foreach (KeyValuePair<string, string> FieldAndValue in FieldAndValueList)
{
if (counter > 0) { UpdateString += "," };
UpdateString += $"SET {FieldAndValue.Key} = {FieldAndValue.Value} ";
Counter += 1;
}
if (UpdateCondition.Trim() != "") { UpdateString += $"WHERE {UpdateCondition};"; }
SqlComm = SqlConn.CreateCommand();
SqlComm.CommandText = UpdateString;
SqlComm.ExecuteNonQuery;
}
catch { ShowError(); }
finally { SqlClose(); }
}
然后会像这样执行:
List<KeyValuePair<string, string>> UpdateValues = new List<KeyValuePair<string, string>>;
UpdateValues.Add(new KeyValuePair<string, string>("age", txtAge.text));
UpdateRow("user", "user_id = X", UpdateValues);
我正在尝试创建它,因此 SQL 注入是不可能的。
I'm trying to create it so SQL injection is not possible.
那你必须使用参数;对于各个字段,类似以下内容会起作用:
if (counter > 0) { sb.Append(","); }
var pName = "@p" + counter.ToString();
sb.Append("[").Append(FieldAndValue.Key).Append("]=").Append(pName);
cmd.Parameters.AddWithValue(pName, ((object)FieldAndValue.Value) ?? DBNull.Value);
Counter += 1;
其中 sb
是一个 StringBuilder
(以避免太多的字符串连接)
但是!你计划的string UpdateCondition
本来就是无解的。 不能injection-safe。你需要想出更好的方法。
或者,更好:使用任何 off-the-shelf ORM。
我正在尝试编写用于构建 Insert/Update 查询的通用代码。到目前为止,我只创建了更新查询,但考虑到 SQL 注入我有疑问。
我的主要目标是尝试创建代码以减少一遍又一遍地重新键入相同代码的时间。
public SqlConnection SqlConn;
private SqlCommand SqlComm;
public void UpdateRow(string TableName, string UpdateCondition, List<KeyValuePair<string, string>> FieldAndValueList)
{
SqlOpen();
try
{
string UpdateString = $"UPDATE {TableName} ";
int counter = 0;
foreach (KeyValuePair<string, string> FieldAndValue in FieldAndValueList)
{
if (counter > 0) { UpdateString += "," };
UpdateString += $"SET {FieldAndValue.Key} = {FieldAndValue.Value} ";
Counter += 1;
}
if (UpdateCondition.Trim() != "") { UpdateString += $"WHERE {UpdateCondition};"; }
SqlComm = SqlConn.CreateCommand();
SqlComm.CommandText = UpdateString;
SqlComm.ExecuteNonQuery;
}
catch { ShowError(); }
finally { SqlClose(); }
}
然后会像这样执行:
List<KeyValuePair<string, string>> UpdateValues = new List<KeyValuePair<string, string>>;
UpdateValues.Add(new KeyValuePair<string, string>("age", txtAge.text));
UpdateRow("user", "user_id = X", UpdateValues);
我正在尝试创建它,因此 SQL 注入是不可能的。
I'm trying to create it so SQL injection is not possible.
那你必须使用参数;对于各个字段,类似以下内容会起作用:
if (counter > 0) { sb.Append(","); }
var pName = "@p" + counter.ToString();
sb.Append("[").Append(FieldAndValue.Key).Append("]=").Append(pName);
cmd.Parameters.AddWithValue(pName, ((object)FieldAndValue.Value) ?? DBNull.Value);
Counter += 1;
其中 sb
是一个 StringBuilder
(以避免太多的字符串连接)
但是!你计划的string UpdateCondition
本来就是无解的。 不能injection-safe。你需要想出更好的方法。
或者,更好:使用任何 off-the-shelf ORM。