我看了很多问题,但显然我的“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()
,但这实际上会删除参数本身,而不仅仅是值,因此我基本上需要重新添加参数并重新准备,这似乎也破坏了整个目的。谢绝。现在,我只能遍历
s.Parameters
并将它们全部设置为 null 或其他某个值。这样做正确吗?不幸的是,在我的当前项目中,我有大约 15 个参数的查询需要执行 ~10,000 次。我可以将这个迭代推到一个方法中,但是想知道是否有更好的方法来解决这个问题(没有存储过程)。我的当前解决方法是创建一个扩展方法
SqlParameterCollection.Nullify
,将所有参数设置为 null,这对我的情况来说很好。我只需在执行后运行此方法。
我找到了一些几乎完全相同但(在我看来)没有回答的问题:
SQLite/C#连接池和预处理语句混淆(Serge已经非常接近回答了!)
我能找到的最好的答案是(1)常识优先,以及(2)这个页面:
Prepare()
,每次都创建SqlCommand
,除非你可以重构你的逻辑,使其在单个存储过程调用中完成所有操作。 - Sven Grosen