C# 如何正确清理(或参数化)SQL压缩Insert语句
EDIT请注意,该语句不是一次插入。它使用C# 如何正确清理(或参数化)SQL压缩Insert语句,c#,linq-to-sql,sql-server-2008,insert,C#,Linq To Sql,Sql Server 2008,Insert,EDIT请注意,该语句不是一次插入。它使用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.
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 myList=new List();
myList.添加(“MyName”);
myList.Add(“我的地址”);
StringBuilder queryInsert=新建StringBuilder();
Append(“插入客户(名称、地址)值({0},{1})”;
this.myDataContext.ExecuteCommand(queryInsert.ToString(),myList.ToArray();)
使用参数化查询
public int ExecuteCommand(
string command,
params Object[] parameters
)
例如:
List myList=new List();
myList.添加(“MyName”);
myList.Add(“我的地址”);
StringBuilder queryInsert=新建StringBuilder();
Append(“插入客户(名称、地址)值({0},{1})”;
this.myDataContext.ExecuteCommand(queryInsert.ToString(),myList.ToArray();)
请看(SQLServer2008的新增功能)-这些功能允许您一次性传递所有值
唯一的问题是,这些都没有烘焙到Linq2SQL中,因此您需要提供自己的方法
有关示例,请参阅博客文章。查看(SQL Server 2008新增)-这些允许您一次性传递所有值
唯一的问题是,这些都没有烘焙到Linq2SQL中,因此您需要提供自己的方法
例如,请参阅博客帖子。我开始写评论,但时间太长了 LINQtoSQL中的参数化查询应该适合您。大概是这样的:
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());
StringBuilder sbSQL=新建StringBuilder(
“插入[表格]([fk_id]、[说明]、[标题])值”);
int paramNum=0;
列表参数值=新列表();
foreach(项目中的var项目)
{
AppendFormat(“({{{0}},{{{1}}},{{{2}},”,
paramNum,
paramNum+1,
paramNum+2);
paramValues.Add(item.fk_id);
参数值。添加(项目说明);
参数值。添加(项目名称);
paramNum+=3;
}
myDataContext.ExecuteCommand(
sbSQL.Remove(sbSQL.Length-1,1).ToString(),
paramValues.ToArray());
该函数只接受SQL命令,并带有与标准.NET字符串格式函数兼容的标记(
{0}
),然后将传递的值转换为参数,并使用其生成的参数名代替标记。由您自己编写命令并按照自己的喜好安排参数;它不会检查或解析命令。我开始写评论,但这太长了
LINQtoSQL中的参数化查询应该适合您。大概是这样的:
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());
StringBuilder sbSQL=新建StringBuilder(
“插入[表格]([fk_id]、[说明]、[标题])值”);
int paramNum=0;
列表参数值=新列表();
foreach(项目中的var项目)
{
AppendFormat(“({{{0}},{{{1}}},{{{2}},”,
paramNum,
paramNum+1,
paramNum+2);
paramValues.Add(item.fk_id);
参数值。添加(项目说明);
参数值。添加(项目名称);
paramNum+=3;
}
myDataContext.ExecuteCommand(
sbSQL.Remove(sbSQL.Length-1,1).ToString(),
paramValues.ToArray());
该函数只接受SQL命令,并带有与标准.NET字符串格式函数兼容的标记(
{0}
),然后将传递的值转换为参数,并使用其生成的参数名代替标记。由您自己编写命令并按照自己的喜好安排参数;它不会检查或分析命令。什么是myDataContext
?LINQ到SQL上下文?实体框架上下文?什么是myDataContext?LINQ到SQL上下文?实体框架上下文?请注意,它不是一个insert语句,而是许多insert语句(通常约为12k)。它将一个foreach封装在附加到insert的值数组周围。鉴于您正在向它传递一个与string.Format
兼容的查询(因此出现了{0}
,{1}
,等等),我看不出如果将它分解为多个值集会有什么不同。看起来上下文只是在创建命令和参数,然后将参数名传递到字符串。Format
(或类似的东西)来格式化命令。@Adam-多个insert语句比一个insert语句花费的时间更长。@Jeremy:我不是说你应该使用多个insert语句。带我解释的评论太长了;请参阅我发布的答案。请注意,它不是一个insert语句,而是许多insert语句(通常约12k)。它将一个foreach封装在附加到insert的值数组周围。鉴于您正在向它传递一个与string.Format
兼容的查询(因此出现了{0}
,{1}
,等等),我看不出如果将它分解为多个值集会有什么不同。看起来上下文只是在创建命令和参数,然后将参数名传递到字符串。Format
(或类似的东西)来格式化命令。@Adam-多个insert语句比一个insert语句花费的时间更长。@Jeremy:我不是说你应该使用多个insert语句。带我解释的评论太长了;看我贴的答案。我不明白你之前的意思。我认为这就是解决办法!我不明白你以前的意思。我认为这就是解决办法!