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

时间:2011-02-01 15:10:33

标签: c# linq-to-sql sql-server-2008 insert

编辑请注意,该语句不是单个插入。它使用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次。但我不知道我应该如何对其进行分类。

3 个答案:

答案 0 :(得分:2)

查看table value parameters(SQL Server 2008新增功能) - 这些允许您一次性传递所有值。

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

有关示例,请参阅this博文。

答案 1 :(得分:1)

使用参数化查询。

public int ExecuteCommand(
    string command,
    params Object[] parameters
)

E.g:

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()); }

答案 2 :(得分:1)

我开始撰写评论,但这太长了。

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}}},{{0}},{{{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字符串格式化函数兼容的标记({{1}}),然后将您传递的值转换为参数并使用其生成的参数名称代币的位置。您可以自己编写命令并根据需要排列参数;它不会检查或解析命令。