回答

收藏

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

技术问答 技术问答 216 人阅读 | 0 人回复 | 2023-09-13

我看了很多问题,但显然我的 SO-fu 无法 胜任; S5 [6 n, q" Q- X9 {4 R
这项任务,所以我来了。我试图有效地使用准备好的语句,而不仅仅是指对单个语句进行参数化,而是要对它进行多次编译以供重用。我的问题在于参数和重用以及如何正确实现。
2 d& m% _2 O  a: e% f, N通常,我遵循此过程(人为的示例):
: A  Z- |  B' a  X2 |1 o  D4 w  K+ dSqlConnection db = new SqlConnection(...);; a& e0 m. v$ R6 T6 O) V, d7 r
SqlCommand s = new SqlCommand("select * from foo where a=@a", db);
; h0 A+ p( y0 N+ S/ f3 m6 Es.Parameters.Add("@a", SqlDbType.VarChar, 8);
7 c5 M0 g& w/ P) e% j- o3 ps.Prepare();5 e! G" q7 Z: ]) Q1 o& h1 U2 K
...
% A8 c" a9 E6 E: {. Ns.Parameters["@a"] = "bozo";  I7 q' h; Y& j1 }
s.Execute();; r" r# ]5 K' H0 b2 C
超级好用
% t* y" `1 E6 t# g+ }& h3 \但是,我不想每次运行此查询时都执行所有这些步骤(或后四个步骤)。这似乎正在抵消准备好的语句的整个思想。在我看来,我只需要更改参数并重新执行,但是问题是如何做到这一点?
- l% c! n2 Z6 q2 j* M我试过了s.Parameters.Clear(),但这实际上删除了参数本身,而不仅是值,因此我基本上需要重新Add输入参数,然后重新输入Prepare,这似乎也破坏了整个观点。不用了,谢谢。6 v0 |/ s$ q" ^7 s( Z0 a% p
在这一点上,我要遍历s.Parameters并将它们全部设置为null或其他一些值。 这样对吗?
; a: S$ w9 Q4 x# Q& e: w8 _不幸的是,在我当前的项目中,我有约15个参数的查询,每次运行都需要执行约10,000次。我可以将这种迭代分解为一种方法,但是想知道是否有更好的方法(没有存储的proc)。- Y* {9 x0 d9 T/ U9 _
我当前的解决方法是扩展方法,SqlParameterCollection.Nullify该方法将所有参数设置为null,这对于我的情况而言是很好的。我只是在执行后运行它。& ]: _( \% U# C& a5 M( f8 \; g
' j; ]7 a, d5 ?( x* a& J6 r
               
1 l! G, m( h$ ^$ A解决方案:: F; y# w8 D2 \" D& ?9 M- y( R' o
               
) Y9 D5 w" G) Y+ [
, o+ T& {: g- n5 r! X# ~
* h! m  S7 ~- a4 z$ h9 Q9 ]                当重新使用准备好的SqlCommand时,肯定需要做的就是将参数值设置为新的?使用后,您无需清除它们。# K: }8 o$ ?) g0 }! [& A
就我自己而言,我从未见过在过去十年中生产的DBMS可从准备语句中获得任何显着的好处(我想如果DB. _6 S$ {" k9 O3 N$ o2 f
Server可能处于其CPU极限的情况下,也许会,但这不是典型的)。您确定需要准备吗?2 H0 m! X  `4 @' E" L
除非从外部源上载,否则运行同一命令“每次运行约10,000次”对我来说有点难闻。在这种情况下,批量加载可能会有所帮助?每次跑步都在做什么?8 @- p+ b- Q+ Q. d+ y. r! ?5 d
干杯-
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则