编辑请注意,该语句不是单个插入。它使用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();


我真的很想使用这种方法,因为它加速了数据库插入2次。但是我不知道该如何对它进行参数化。

最佳答案

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

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}),然后将您传递的值转换为参数,并使用其生成的参数名称代替令牌。您可以根据自己的喜好编写命令并排列参数。它不会检查或解析命令。

关于c# - 如何正确清理(或参数化)SQL压缩插入语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4864227/

10-14 14:57
查看更多