好的,这是那些自以为是的主题之一,但是根据您的知识,见解和当前实践,设置以下方案的最佳方法是什么?
我正在构建一个广泛的数据输入应用程序,而从广义上来说,我的意思是我只有基本设置,它包含了整个程序的约15%至25%,并且我大约有15个表单是部分设置的。(他们仍然需要工作)我使用SQL Compact 4.0作为后端数据库,因为我没有存储MMO的大量数据,所以我实际上并不需要更扩展的数据库,并且目前这只是一个本地应用程序。
我希望能够将其设置为显示为单个窗口,并根据菜单系统将其更改为各种不同的页面,但是我似乎找不到关于如何实现此目标的很好的教程,所以如果任何人都知道的,请赐教。
但是,所讨论的方案是如何连接到数据库。我正在使用2个SQLCE数据库,一个存储基于服务和人员的恒定数据,另一个存储基于不断变化的数据或基于第一个数据库输入的新数据。我已经看到了许多有关如何设置此方法的方法,目前我正在使用一种方法,在该方法中,我具有所有其他表单都继承自的BaseForm。在BaseForm中,我具有许多形式通用的方法和变量,从而最大程度地减少了重复的代码量。
这包括到两个数据库的连接字符串,以及两个打开到其中一个数据库的连接的方法。像这样:
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
using (SqlConnection conn = new SqlConnection(...)) { using(SqlCommand cmd = new SqlCommand(..., conn)) { conn.Open(); using(DataReader dr = cmd.ExecuteReader()) // or load a DataTable, ExecuteScalar, etc. { ... { } }
这样,即使抛出异常,资源也将被关闭和处置。
简而言之,在应用程序打开或每种形式打开时打开连接可能不是最佳方法。