我正在尝试创建用于构建插入/更新查询的通用代码。到目前为止,我只创建了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注入。
答案 0 :(得分:3)
我正在尝试创建它,因此无法进行SQL注入。
然后您必须使用参数;对于单个字段,将执行以下操作:
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
本质上是无法解决的。不能将 设为注射安全。您需要考虑一种更好的方法。
或者更好:使用任何现成的ORM。