回答

收藏

C#数据连接最佳实践?

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

好的,这是那些自以为是的主题之一,但是根据您的知识,见解和当前实践,设置以下方案的最佳方法是什么?
2 I. e; ~1 o& }+ U/ J: j; ?我正在构建一个广泛的数据输入应用程序,而从广义上来说,我的意思是我只有基本设置,它包含了整个程序的约15%至25%,并且我大约有15个表单是部分设置的。(他们仍然需要工作)我使用SQL! Z1 d- l  @1 _, c) j0 {$ f
Compact 4.0作为后端数据库,因为我没有存储MMO的大量数据,所以我实际上并不需要更扩展的数据库,并且目前这只是一个本地应用程序。
5 @9 A2 g. y6 J, q7 Q6 Q我希望能够将其设置为显示为单个窗口,并根据菜单系统将其更改为各种不同的页面,但是我似乎找不到关于如何实现此目标的很好的教程,所以如果任何人都知道的,请赐教。
' I0 V7 n6 I3 m/ G' X3 O  J" P但是,所讨论的方案是如何连接到数据库。我正在使用2个SQLCE数据库,一个存储基于服务和人员的恒定数据,另一个存储基于不断变化的数据或基于第一个数据库输入的新数据。我已经看到了许多有关如何设置此方法的方法,目前我正在使用一种方法,在该方法中,我具有所有其他表单都继承自的BaseForm。在BaseForm中,我具有许多形式通用的方法和变量,从而最大程度地减少了重复的代码量。2 L1 f$ k- o" t
这包括到两个数据库的连接字符串,以及两个打开到其中一个数据库的连接的方法。像这样:
3 V, L' A, C1 Q* F: B% p7 Zinternal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf");! u- |0 _' ~& R2 m( n1 y% w2 r" X
internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf");& e9 I& H) A' m+ x+ x; q3 ]: O
internal SqlCeCommand command;
, H( O% _$ E- J% d, I% V. H$ \" pinternal void openDataConnection() // Opens a connection to the data tables
$ i# q) l/ V) u. C5 h0 \3 R& w        {' B0 Q3 ^! e% H* D- F, B. x; E
            try) ~9 r: o5 X/ }* Y6 A; z- r8 ]5 ^( M
            {
, x1 c8 U; i) {: X8 M                if(dataConn.State == ConnectionState.Closed), z" ~1 b5 t# y8 ~& d) _
                    dataConn.Open();
2 a' m$ x' h( J+ w1 X/ ~. Q3 ^& y            }2 D% }3 j* l$ v8 C2 y  X2 U2 H
            catch(SqlCeException ex)+ R+ N" @: v% L0 D* H
            {5 C6 t7 p8 |) ?" n# J7 Y" L' v
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
2 b6 c4 `0 W8 m1 ]" C: d5 @  Z            }
6 s3 m: N0 [& J4 F        }
  A+ `( K5 s( R. q4 t3 t5 p* |        internal void openLogConnection() // Opens a connection to the log tables# d9 H4 R2 o) O6 z
        {! o& P# |) L1 T1 t# J" ~* O
            try
6 Z6 Q& z  @+ b0 U; H            {  Z! Y$ ^$ ^3 {2 X) A
                if(logConn.State == ConnectionState.Closed)
5 s% q7 ^! Q) H4 k/ C3 l8 u                    logConn.Open();! g9 z( r2 a# A( H+ e. A
            }, k+ [# H3 \- I) d, ?
            catch (SqlCeException ex)0 |3 R5 m, ~0 B8 l; Q7 n  e5 N) O
            {
* i% c  h0 z7 q                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
0 L# t% }. w' ?4 z1 a4 V            }
5 F; W! Z3 {. C+ z% o        }! v1 ]- D1 _1 o7 l! t6 G
然后,每当需要打开连接时,我只需调用与我需要访问的数据库相对应的打开连接方法,然后在finally语句中将其关闭。这样,连接永远不会在需要时打开很长时间。当然,这意味着有很多对开放连接方法的调用。那么这是实现这种情况的最佳方法,还是有更好的方法?! q% W- J7 I. y' l0 {8 }
加载表单后立即打开连接,然后在表单关闭时将其关闭是否更好?我有一次同时打开多个表单的情况,每个表单可能需要与数据库的开放连接,因此,如果一个关闭,那么其他表单就会被搞错了吗?还是应该在应用程序启动时打开与两个数据库的连接?任何输入将不胜感激。谢谢。
, d0 d' g6 j' l+ s' b8 e               
2 ^( L. _/ B8 O) C0 f& n& q解决方案:2 S) l/ K+ c+ h* Z9 J4 T
               
0 A  I7 m4 q" v% I) t3 i- A8 L. R, w7 S" u0 @

+ d6 Y) `% F2 H                连接由.NET合并,因此重新创建它们通常不是一项昂贵的操作。但是,长时间保持连接断开状态可能会引起问题。
7 t* k0 |/ s7 h$ V) s9 F2 Q# n  \大多数“最佳实践”都告诉我们尽可能晚地打开连接(在执行任何SQL之前),并尽快关闭它们(在提取最后一点数据之后)。
4 Q5 o# }. ?9 u3 X, W自动执行此操作的有效方法是使用以下using语句:+ z1 G- I! z3 P% `+ O6 {: d
using (SqlConnection conn = new SqlConnection(...))
+ f8 Q" l5 S1 m. y3 ]{
' I. ~% c1 @3 _& Z* k6 K    using(SqlCommand cmd = new SqlCommand(..., conn))
1 I  Y! L+ O4 u- |    {1 ~; J3 `. f1 X" K, p
        conn.Open();
9 C1 b# J8 }* @3 _% c        using(DataReader dr = cmd.ExecuteReader())  // or load a DataTable, ExecuteScalar, etc.    ( t- `# l' W, c2 A0 j  ]1 L
        {; l/ m' v  A/ O
             ...& \6 v4 x: A" f) u! m' Y' ]
        {. D9 T3 F1 j3 e1 I# E$ B8 c6 C
    }. c# U, {* L8 T5 Z) E8 i% t2 Q, M2 W
}
9 b0 B) f1 y7 g) ^+ F& @这样,即使抛出异常,资源也将被关闭和处置。! r( K- J8 C, i; M0 d, z
简而言之,在应用程序打开或每种形式打开时打开连接可能不是最佳方法。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则