C#数据连接最佳实践?

好的,所以这是那种自以为是的主题之一,但根据您的知识,意见和当前实践,设置以下方案的最佳方法是什么?

我正在构建一个广泛的数据输入应用程序,而且我的意思是我只有基本设置,其中包含大约15-25%的整体程序,我有大约15个部分设置的表单。 (他们仍然需要工作)我使用SQL Compact 4.0作为我的后端数据库,我不需要更广泛的数据库,因为我没有存储MMO的数据,目前这只是一个本地应用程序。

我希望能够将其设置为显示为单个窗口,只是根据菜单系统更改为各种不同的页面,但我似乎无法找到关于如何实现的良好教程,所以如果有谁知道,请赐教。

然而,问题是如何连接到数据库。 我正在使用2个SQLCE数据库,一个存储基于服务和人员的常量数据,另一个存储基于第一个数据库输入的不断变化的数据或新数据。 我已经看到了许多不同的方法来设置它,目前我正在使用一个我有一个所有其他formsinheritance的BaseForm。 在BaseForm中,我有许多表单共有的方法和变量,从而最大限度地减少了重复的代码量。

这包括两个数据库的连接字符串,以及打开与其中任何一个数据库的连接的2个方法。 像这样:

internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf"); internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf"); internal SqlCeCommand command; internal void openDataConnection() // Opens a connection to the data tables { try { if(dataConn.State == ConnectionState.Closed) dataConn.Open(); } catch(SqlCeException ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } internal void openLogConnection() // Opens a connection to the log tables { try { if(logConn.State == ConnectionState.Closed) logConn.Open(); } catch (SqlCeException ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 

然后,每当我需要一个开放连接时,我只需调用与我需要访问的数据库相对应的开放连接方法,然后在finally语句中将其关闭。 通过这种方式,连接永远不会打开很长时间,就在需要时。 当然,这意味着对开放连接方法的调用很多。 那么这是实现这种情况的最佳方式,还是有更好的方法?

表单加载后立即打开连接然后在表单关闭时关闭它是否更好? 我有一个实例,一次打开多个表单,每个表单可能需要一个打开的数据库连接,所以如果一个关闭它,那么其他表格将被搞砸? 或者我应该在应用程序启动时打开与两个数据库的连接? 任何输入将不胜感激。 谢谢。

连接由.NET汇集,因此重新创建它们通常不是一项昂贵的操作。 但是,长时间保持连接打开可能会导致问题。

大多数“最佳实践”告诉我们尽可能晚地打开连接(在执行任何SQL之前)并尽快关闭它们(在提取最后一位数据之后)。

using语句自动执行此操作的有效方法是:

 using (SqlConnection conn = new SqlConnection(...)) { using(SqlCommand cmd = new SqlCommand(..., conn)) { conn.Open(); using(DataReader dr = cmd.ExecuteReader()) // or load a DataTable, ExecuteScalar, etc. { ... { } } 

这样,即使抛出exception,资源也会被关闭和处理掉。

简而言之,在应用程序打开或每个表单打开时打开连接可能不是最好的方法。

我认为最好在应用程序启动时打开它们,因为你需要数据库中的东西吗?我不是这方面的专家,这只是我的意见……我编写了一些类似的应用程序并在一开始就建立了连接主要forms。 我创建单独连接的唯一forms是登录表单。