如何在c#中减少项目中数据库连接的数量?

时间:2016-02-06 12:20:12

标签: c# sql sql-server

我是c#的新手并使用Windows窗体。

我正在构建一个包含大约25 Forms和25 user controls的项目,这些Formsuser controls中的每一个都使用SQL数据库从数据库中读取数据(请注意,我在app.config文件中使用连接字符串。

如代码所示,我总是将sql查询放在50个Form / user控件构造函数中,以便从数据库中读取数据(例如控件文本和其他东西);

我的程序运行正常没有问题,但想象当我运行程序时,所有25 forms和25 user controls将“同时”查询数据库,这让我觉得我在做有些不对劲,可能会在我的程序中出现副作用。

我不知道将查询置于构造函数中是否正确(例如按钮文本查询)? 另外我觉得25 Forms和25 user controls在运行时同时攻击SQL数据库是否有办法减少与数据库的连接数?请指导我。谢谢

public partial class SubMenu1 : UserControl
{
    SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
    SqlCommand MyCommand = new SqlCommand();
    DataTable DataTable = new DataTable();
    SqlDataAdapter Sql_Data_Adapter = new SqlDataAdapter();


    public SubMenu1()
    {
       InitializeComponent();



        DataTable.Rows.Clear();
        DataTable.Columns.Clear();

        MyConnection.Open();
        MyCommand.CommandText = "SELECT * FROM Table21 ";
        MyCommand.Connection = MyConnection;
        Sql_Data_Adapter.SelectCommand = MyCommand;
        Sql_Data_Adapter.Fill(DataTable);

         MyConnection.Close();

     }

    public void MyFunction()
    {
        //  Do some stuff with the DataTable ...
    }



  }

2 个答案:

答案 0 :(得分:3)

你的代码有很多问题。首先不要使用全局连接,有Connection Pool

  

连接池减少了新连接的次数   必须打开。平民保持对物质的所有权   连接。它通过保持一组活动来管理连接   每个给定连接配置的连接。每当一个用户   调用在连接上打开,pooler查找可用的   池中的连接。如果池连接可用,则为   将其返回给调用者而不是打开新连接。当。。。的时候   应用程序调用关闭连接,pooler将其返回   合并的一组活动连接而不是关闭它。一旦   连接返回到池中,它已准备好在池上重用   下一次公开电话。

此外,您应该在使用或在try / catch / finally块中使用连接。这是必需的,因为如果发生某些异常,连接永远不会是Closed,当您尝试重用它时会导致异常,或者它将永远不会返回到连接池。

再次使用块包装SqlDataAdapter,需要在完成工作后关闭适配器。您需要调用Dispose,因此SqlAdapter会释放组件使用的所有资源。这是每个IDisposable对象的规则。如果您不进行处理,则处理将在GC终结器上进行,但何时执行将由GC决定。因此,不处理此对象可能会产生高成本。这篇关于IDisposable

的msdn文章

我建议您创建单独的数据访问层,我在此问题中做了一个简单的显示设计问题:checking user name or user email already exists

如果您不想要单独的数据访问层,您的代码应如下所示:

public partial class SubMenu1 : UserControl
{

     public SubMenu1()
     {
         InitializeComponent();
     } 

    public void MyFunction()
    {
         DataTable dataTable = new DataTable();
         using(SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
         using(SqlDataAdapter sqlDataAdapter = new SqlDataAdapter())
         {
              myConnection.Open();
              SqlCommand myCommand = new SqlCommand();

              myCommand.CommandText = "SELECT * FROM Table21";
              myCommand.Connection = myConnection;

              sqlDataAdapter.SelectCommand = myCommand;
              sqlDataAdapter.Fill(dataTable);
         }

         if(dataTable.Rows.Count > 0)
         {
              //do stuff ....
         }

     }
}

答案 1 :(得分:-2)

使用静态连接成员创建类。 所有表单/控件都将获得此连接并使用它。 在app shutdown上关闭此连接。