回答

收藏

使用SqlDataReader作为资源的惯用法

技术问答 技术问答 206 人阅读 | 0 人回复 | 2023-09-14

问题继续,我发现自己一遍又一遍地编写以下代码:
1 X) _: R0 _& [. FSqlCommand command = new SqlCommand();) f3 G; G+ s) Y- W
// Code to initialize command with what we want to do/ r5 L) M* Z+ E3 ?* g  V# V- z
using (SqlConnection connection = openConnection())
6 \; m1 x/ i4 s% ~{0 v$ f# t/ @1 V) W
    command.Connection = connection;
( q# `: ^' ]! g6 ~) {# h    using (SqlDataReader dataReader = thisCommand.ExecuteReader())# s) J& ~# ~) ]) m( o
    {* |5 x& \! }0 ~6 M2 ^# c  i
        while (dataReader.Read())
- s) w1 L+ Y! U3 v        {
( X( a" V; `1 P            // Do stuff with results
/ Q5 v4 P$ O- o! t6 C( {! R0 M        }
* d7 I. v/ g; d    }
; I7 u( @- C. G}( A6 p! c5 J& y6 A7 t
必须嵌套两个using语句相当繁琐。有没有办法 告诉 SqlDataReader它拥有命令,并告诉命令它拥有连接?
' L4 e$ C! Y2 ]9 j9 O: X如果有一种方法,那么我可以编写一个可以这样调用的辅助方法:
) y2 p+ }' T* c0 ?! T6 t' V& v// buildAndExecuteCommand opens the connection, initializes the command$ P3 I% r4 |. B' d8 \$ F
// with the connection and returns the SqlDataReader object. Dispose of the
6 m% d8 D1 ]/ U) v: t// SqlDataReader to dispose of all resources that were acquired
8 _* G: \" r/ N+ b& Jusing(SqlDataReader reader = buildAndExecuteCommand(...))& R% {+ s: \  [
{- b+ ]: Z6 j+ Z1 y# J
    // Do stuff with reader
& ~- V% U9 _, b- X5 O) Y$ z}: f* t" |2 R, l; R, N& k
还是我必须忍耐一下,并通过SqlDataReader编写自己的包装器?
) `5 o1 `6 }! s& Y( Q% {& e! T5 \3 @8 ]               
& c# k; d' s" O2 G/ }7 P( k9 Z解决方案:3 a6 Z' x5 r0 l# f% H: w4 a  @
               
8 r: r* d2 `( w* L) V. d
, U6 ?+ ~4 i- W) |
3 ^  v5 {/ ?) j) T0 N8 h, c6 g                一件事就是编写一个为您处理的方法,并用每个结果调用一个委托。例如:" {6 W  m* ~6 B: B) L2 \( v- ~
using (SqlConnection connection = openConnection())
7 C+ u+ \. d2 S. O& _' n. v& }% M{
" o8 v8 s8 s! H5 b    command.Connection = connection;. W+ b5 T- @3 `
    ExecuteReaderWithCommand(command, reader =>3 B! A2 [7 f- v! b; w( d3 t# Q
    {6 z2 o0 {# `# Q& j( u  B  e9 o
        // Do stuff with the result here.) F2 |3 N; o! b; }
    });% ]6 s/ @$ M4 I) {; _' Q. ?
}
6 c9 P1 h5 H' n$ h+ G# {然后,ExecuteReaderWithCommand将类似于:
2 i, ]. g* O* l8 Opublic static void ExecuteReaderWithCommand(SqlCommand command,$ P1 I1 d! s/ c. Q, \7 M+ ]
    Action action)( F& W; T1 a* B6 h7 b7 y5 a
{
# i5 O* G( [: t6 V1 @    using (SqlDataReader dataReader = thisCommand.ExecuteReader())- D) j2 e1 N& F3 c1 e
    {
- U+ x: ^2 B1 I3 m' k- N        while (reader.Read())- O6 _& H3 T! Q7 k3 G/ x
        {$ H% c0 o1 W; w, B/ p- s, I
            action(reader);7 I' C6 e! q5 y* F, e0 X: y
        }
9 O0 K, E; F" Y& _& A. H5 K8 y# g# \    }; D1 k6 ?2 o5 {/ ?- z: c& O/ Y) W
}
- E, b0 K2 {. I" L如果需要,可以将其作为扩展方法SqlCommand。哎呀,如果您愿意的话,您也可以去镇上并为您打开连接……您越能抽象化“打开/使用/关闭”的想法,那就越好。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则