当前位置: 首页 > 面试题库 >

C#数据连接最佳实践?

秦景福
2023-03-14
问题内容

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

我正在构建一个广泛的数据输入应用程序,而从广义上来说,我的意思是我只有基本设置,它包含了整个程序的约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 (SqlConnection conn = new SqlConnection(...))
{
    using(SqlCommand cmd = new SqlCommand(..., conn))
    {
        conn.Open();
        using(DataReader dr = cmd.ExecuteReader())  // or load a DataTable, ExecuteScalar, etc.    
        {
             ...
        {
    }
}

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

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



 类似资料:
  • 问题内容: 我有一个用Go编写的Web服务,目前我将这个Global包导入到任何地方,其中包含与MongoDB的连接(通过MGO),但是我不得不说这对我来说非常讨厌。在Go中维护与数据源的连接的最佳实践是什么?我来自PHP世界,因此来自Global:S 问题答案: 导入一个将初始化对象导出为包级别变量或通过访问器/初始化程序导出的包没有错。后者也许对古典“ OOP主义者”更具吸引力。

  • 我正在构建一个节点应用程序,它将查询简单的和更复杂的(多连接)查询。我正在寻找关于我应该如何管理mySQL连接的建议。 我有以下几个要素: server.js:express Router1.js(虚构名称):快速路由器中间件 Router2.js(虚构名称):快速路由器中间件 我是否应该在每次请求“/router1/”时都连接到mysql,就像本例中那样,还是最好在启动时保持一个连接打开?作为:

  • 问题内容: 在厌倦了c3p0的恒定锁定之后,我将转向BoneCP作为数据库的备用连接池。我有一个服务器应用程序,每分钟处理大约7,000个项目,需要将这些项目记录到我们的MySQL数据库中。我目前有100个工作线程,并按如下方式设置了我的池: 这些应用程序是否接受这些设置?我问是因为运行一两分钟后,在尝试调用池时出现BoneCP异常。谢谢您的帮助。 这是我在工作线程中用于db调用的代码,它不会在网

  • 问题内容: 目前,我们正在使用带有8gb RAM的4个cpu窗口框,并在同一框上安装了MySQL5.x。我们正在为应用程序使用Weblogic应用程序服务器。我们的应用程序目标是200个并发用户(显然不是同一模块/屏幕)。那么,我们应该在连接池中配置的最佳连接数是多少(最小和最大数)(我们正在使用weblogic AS的连接池机制)? 问题答案: 这个问题有一个非常简单的答案: 连接池中的连接数应

  • 问题内容: 我有一个具有相当基本配置的基本Spring JDBC应用程序: 我想介绍一个连接池,在阅读了SO上的多个线程后,我对使用哪个池库感到有些困惑。 C3P0和DBCP似乎在SO方面具有更多的信誉。由于使用的是Oracle,因此我也可以使用驱动程序提供的池数据源。 我了解还有更多可用的库-例如新的Apache Tomcat 7池库。 我真的应该避免使用任何库吗? 我应该在给定的库中使用任何建

  • 问题内容: 我正在使用ADO.Net连接到某些Sql Server和Oracle数据库,并且我想同时运行一些查询。 我将SqlClient名称空间中的类用于Sql Server,将ODP.Net用于Oracle。对于Sql Server,我在连接字符串中添加了MARS选项,并在SqlCommand上调用了异步API。ODP.Net不提供异步API,因此我必须为并发的Oracle命令分配单独的线程。