C# 数据连接最佳实践?

标签 c# sql database connection

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

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

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

然而,所讨论的场景是如何连接到数据库。我正在使用 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 语句中将其关闭。通过这种方式,连接永远不会打开很长时间,只在需要时才打开。当然这意味着有很多对打开连接方法的调用。那么这是实现这种场景的最佳方式,还是有更好的方式?

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

最佳答案

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

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

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

关于C# 数据连接最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17552829/

相关文章:

sql - 'greater than' 查询的索引

mysql - ORDER BY date ASC 将没有日期的记录放在有日期的记录之前?

数据库;求和 2 个字段,然后将它们相加

c# - 无法正常运行函数或以后台 worker 的身份运行

mysql - 查找出现次数最多的值的正确 SQL (MYSQL) 是什么?

java - 如果模型发生变化,如何保留数据库数据

java - 在java中获取第一个记录表单数据库?

c# - 使用 StreamWriter 追加文本

c# - 正确的单例类实现

c# - 为什么从 SplashScreen 到 MainPage 的导航顺序不正确