编辑请注意,该语句不是单个插入。它使用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次。但我不知道我应该如何对其进行分类。
答案 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}}),然后将您传递的值转换为参数并使用其生成的参数名称代币的位置。您可以自己编写命令并根据需要排列参数;它不会检查或解析命令。