繁体   English   中英

如何正确清理(或参数化)SQL压缩插入语句

[英]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次。 但我不知道我应该如何对其进行分类。

查看表值参数 (SQL Server 2008的新增内容) - 这些参数允许您一次性传递所有值。

唯一的问题是这些没有被纳入Linq2SQL - 所以你需要提供自己的方法。

有关示例,请参阅博客文章。

使用参数化查询。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM