2010-10-27 76 views
3

解决方案1:什么是调用多个存储过程的最快代码?

foreach (var item in itemList) 
{ 
    myContext.ExecuteStoreCommand("EXEC MyProc {0};", item); // Insertion 
} 

解决方案2:

StringBuilder sb = new StringBuilder(); 
foreach (var item in itemList) 
{ 
    sb.AppendLine(String.Format("EXEC MyProc {0};", item)); // Insertion 
} 
myContext.ExecuteStoreCommand(sb.ToString()); 
+5

这些东西被称为**存储**程序 - **不**存储程序.... – 2010-10-27 14:04:33

+0

混淆似乎是SQL服务器和实体框架4.0。前者在社区中稍微有名;-)。但STORED过程和STORE命令仍然不同。 – 2010-10-27 14:39:30

回答

8

其次是更快(一次调用数据库而不是多次),首先是更安全,因为它可以防止SQL注入。

5

都是秒一个受sql injection,这是肯定的

通过读取thisthis,我同意kekekela

+0

第一个没有使用参数化命令。 – heisenberg 2010-10-27 14:07:47

+0

@Justin - 有关ExecuteStoreCommand的文档指出OP的第一条语句事实上会生成参数化命令:http://msdn.microsoft.com/en-us/library/ee358758.aspx – JeremyDWill 2010-10-27 14:15:35

+0

@kekekela,我更新了我的答案 – Fredou 2010-10-27 14:15:39

2

我猜想解决方案2是因为您的应用程序和数据库之间的I/O较少。如果速度是你所关心的,你可以通过调试System.Diagnostics.Stopwatch utility来检查自己。

+0

测试结果:解决方案2的速度是解决方案1的两倍* – 2010-10-27 14:12:17

+0

似乎很多人怀疑它会是。话虽如此,我强烈建议您考虑其他人关于安全/ sql注入风险的观点。仅仅因为它是最快的方式并不一定意味着它是最好的方式。 – 2010-10-27 14:16:19

1

这听起来像是一个很容易测试的小型优化的机会。

可能它们非常接近相同的速度。

+0

测试结果:解决方案2的速度是解决方案1的两倍* – 2010-10-27 14:13:42

+0

我们正在谈论1ms还是2ms? – codekaizen 2010-10-27 14:24:29

3

解决方案2是更快它只是myContext.ExecuteStoreCommand从方法,以便减少开销单个呼叫通过context对象

+0

测试结果:解决方案2的速度比解决方案1快两倍 – 2010-10-27 14:12:41

1

你没有提到的一个电话。

使用存储过程的名称作为CommandText,将CommandType设置为CommandType.StoredProcedure,并正确添加参数来准备一个SqlCommand。

除了不使用即席查询(每次都必须重新进行修改)的性能提升之外,您还可以将大部分当前的SQL注入问题扼杀在萌芽状态。

相关问题