小编典典

C#数据连接最佳实践?

sql

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

我正在构建一个广泛的数据输入应用程序,而从广义上来说,我的意思是我只有基本设置,它包含了整个程序的约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语句中将其关闭。这样,连接永远不会在需要时打开很长时间。当然,这意味着有很多对开放连接方法的调用。那么这是实现这种情况的最佳方法,还是有更好的方法?

加载表单后立即打开连接,然后在表单关闭时将其关闭是否更好?我有一次同时打开多个表单的情况,每个表单可能需要与数据库的开放连接,因此,如果一个关闭,那么其他表单就会被搞错了吗?还是应该在应用程序启动时打开与两个数据库的连接?任何输入将不胜感激。谢谢。


阅读 149

收藏
2021-05-05

共1个答案

小编典典

连接由.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.    
        {
             ...
        {
    }
}

这样,即使抛出异常,资源也将被关闭和处置。

简而言之,在应用程序打开或每种形式打开时打开连接可能不是最佳方法。

2021-05-05