C# 数据连接最佳实践?

Posted

技术标签:

【中文标题】C# 数据连接最佳实践?【英文标题】:C# Data Connections Best Practice? 【发布时间】:2013-07-07 07:57:16 【问题描述】:

好的,这是一种固执己见的话题,但根据您的知识、观点和当前实践,设置以下场景的最佳方法是什么?

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

我希望能够将其设置为显示为单个窗口,该窗口仅根据菜单系统更改为各种不同的页面,但我似乎找不到一个很好的教程来说明如何实现,所以如果有人知道,请赐教。

然而,有问题的场景是如何连接到数据库。我正在使用 2 个 SQLCE 数据库,一个存储基于服务和人员的常量数据,另一个存储基于第一个数据库输入的不断变化的数据或新数据。我已经看到了许多关于如何设置它的不同方法,目前我正在使用一种方法,其中我有一个 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 语句中关闭它。通过这种方式,连接永远不会打开很长时间,只是在需要时。当然,这意味着对开放连接方法有很多调用。那么这是实现这种场景的最佳方式,还是有更好的方式?

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

【问题讨论】:

在Using Statement ***.com/q/212198/1193596看到这个问题 【参考方案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.    
        
             ...
        
    

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

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

【讨论】:

谢谢,我一直在考虑添加 using 语句并删除打开的连接方法,作为创建连接的更清洁和更有效的方式。只是还没来得及清理我的代码。只需使用 try/catch 方法进行测试。 不应该将conn.Open() 移到SqlCommand 构造函数之前吗?后者将使用连接。 @ZiruiWang 不。简单地创建命令不使用连接,至少不以任何需要打开它的方式。文档中的example 证实了这一点。

以上是关于C# 数据连接最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

C# 实体框架 - 优化/最佳实践

连接/断开数据库的最佳实践是啥?

连接/断开数据库的最佳实践是啥?

在 C# 中创建(按需)SQL Server 2008 Express 数据库的最佳实践?

在 C# 中实现加密和解密的最佳实践 [关闭]

在 C# 中使用 Entity Framework Core 插入数据之前检查重复字符串数据的最佳实践