一尘不染

如何正确有效地重用C#.NET(SQL Server)中的准备好的语句?

sql

我看了很多问题,但显然我的 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并将它们全部设置为null或其他一些值。 这样对吗?
不幸的是,在我当前的项目中,我有约15个参数的查询,每次运行都需要执行约10,000次。我可以将这种迭代分解为一种方法,但是想知道是否有更好的方法(没有存储的proc)。

我当前的解决方法是扩展方法,SqlParameterCollection.Nullify该方法将所有参数设置为null,这对于我的情况而言是很好的。我只是在执行后运行它。



阅读 124

收藏
2021-05-05

共1个答案

一尘不染

当重新使用准备好的SqlCommand时,肯定需要做的就是将参数值设置为新的?使用后,您无需清除它们。

就我自己而言,我从未见过在过去十年中生产的DBMS可从准备语句中获得任何显着的好处(我想如果DB
Server可能处于其CPU极限的情况下,也许会,但这不是典型的)。您确定需要准备吗?

除非从外部源上载,否则运行同一命令“每次运行约10,000次”对我来说有点难闻。在这种情况下,批量加载可能会有所帮助?每次跑步都在做什么?

干杯-

2021-05-05