[英]How to properly sanitize (or parameterize) SQL Compressed Insert Statement
编辑请注意,该语句不是单个插入。 它使用foreach
块插入多个值数组。
StringBuilder sbSQL =
new StringBuilder(
"INSERT INTO [table] ([fk_id], [Description], [Title] ) VALUES");
foreach(var item in items) {
sbSQL.AppendFormat("({0},'{1}','{2}'),",
item.fk_id, item.description, item.title)
}
myDataContext.ExecuteCommand(sbSQL.Remove(sbSQL.Length - 1, 1).ToString());
myDataContext.SubmitChanges();
我真的很想使用这种方法,因为它加速了DB插入2次。 但我不知道我应该如何对其进行分类。
使用参数化查询。
public int ExecuteCommand(
string command,
params Object[] parameters
)
例如:
List<string> myList = new List<string>(); myList.Add("MyName"); myList.Add("MyAddress"); StringBuilder queryInsert = new StringBuilder(); queryInsert.Append("insert into Customers(name, address) values ({0},{1})"); this.myDataContext.ExecuteCommand(queryInsert.ToString(), myList.ToArray()); }
我开始写评论,但这太长了。
LINQ-to-SQL中的参数化查询应该可以正常使用。 像这样的东西:
StringBuilder sbSQL = new StringBuilder(
"INSERT INTO [table] ([fk_id], [Description], [Title] ) VALUES");
int paramNum = 0;
List<object> paramValues = new List<object>();
foreach(var item in items)
{
sbSQL.AppendFormat("({{{0}}},{{{1}}},{{{2}}}),",
paramNum,
paramNum + 1,
paramNum + 2);
paramValues.Add(item.fk_id);
paramValues.Add(item.description);
paramValues.Add(item.title);
paramNum += 3;
}
myDataContext.ExecuteCommand(
sbSQL.Remove(sbSQL.Length - 1, 1).ToString(),
paramValues.ToArray());
ExecuteCommand
函数只接受您的SQL命令,包括与标准.NET字符串格式化函数兼容的标记( {0}
),然后将您传递的值转换为参数并使用其生成的参数名称代替标记。 您可以自己编写命令并根据需要排列参数; 它不会检查或解析命令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.