我看了很多问题,但显然我的 SO-fu 无法 胜任 这项任务,所以我来了。我试图有效地使用准备好的语句,而不仅仅是指对单个语句进行参数化,而是要对它进行多次编译以供重用。我的问题在于参数和重用以及如何正确实现。
通常,我遵循此过程(人为的示例):
SqlConnection db = new SqlConnection(...); SqlCommand s = new SqlCommand("select * from foo where a=@a", db); s.Parameters.Add("@a", SqlDbType.VarChar, 8); s.Prepare(); ... s.Parameters["@a"] = "bozo"; s.Execute();
超级好用 但是,我不想每次运行此查询时都执行所有这些步骤(或后四个步骤)。这似乎正在抵消准备好的语句的整个思想。在我看来,我只需要更改参数并重新执行,但是问题是如何做到这一点?
我试过了s.Parameters.Clear(),但这实际上删除了参数本身,而不仅是值,因此我基本上需要重新Add输入参数,然后重新输入Prepare,这似乎也破坏了整个观点。不用了,谢谢。
s.Parameters.Clear()
Add
Prepare
在这一点上,我要遍历s.Parameters并将它们全部设置为null或其他一些值。 这样对吗? 不幸的是,在我当前的项目中,我有约15个参数的查询,每次运行都需要执行约10,000次。我可以将这种迭代分解为一种方法,但是想知道是否有更好的方法(没有存储的proc)。
s.Parameters
我当前的解决方法是扩展方法,SqlParameterCollection.Nullify该方法将所有参数设置为null,这对于我的情况而言是很好的。我只是在执行后运行它。
SqlParameterCollection.Nullify
当重新使用准备好的SqlCommand时,肯定需要做的就是将参数值设置为新的?使用后,您无需清除它们。
就我自己而言,我从未见过在过去十年中生产的DBMS可从准备语句中获得任何显着的好处(我想如果DB Server可能处于其CPU极限的情况下,也许会,但这不是典型的)。您确定需要准备吗?
除非从外部源上载,否则运行同一命令“每次运行约10,000次”对我来说有点难闻。在这种情况下,批量加载可能会有所帮助?每次跑步都在做什么?
干杯-