【问题标题】:C#, SQL Server database, connection timeout. The timeout period elapsed prior to obtaining a connection from the poolC#,SQL Server 数据库,连接超时。在从池中获取连接之前经过的超时时间
【发布时间】:2016-10-06 16:19:57
【问题描述】:

我正在使用连接类进行连接,然后调用该类进行连接。

在我多次使用连接后,它会冻结,然后出现错误。似乎我同时打开了许多连接我无法弄清楚如何关闭打开的连接。如果那是真正的问题。

MyConnection类:

 public class MyConnection
 {
     private SqlConnection _con;
     public SqlCommand Cmd;
     private SqlDataAdapter _da;
     private DataTable _dt;

     public MyConnection()
     {
        _con = new SqlConnection("Data Source=192.168.1.12\\grs;Initial Catalog=BGI;Persist Security Info=True;User ID=awplanung;Password=pass");

        _con.Open();
     }

     public void SqlQuery(string queryText)
     {
         Cmd = new SqlCommand(queryText, _con);
     }

     public DataTable QueryEx()
     {
         _da = new SqlDataAdapter(Cmd);
         _dt = new DataTable();
         _da.Fill(_dt);
         return _dt;
     }

     public void NonQueryEx()
     {
         Cmd.ExecuteNonQuery();
     }
}          

现在我从我的表单中调用这个连接:就像这个。

MyConnection con = new MyConnection();

con.SqlQuery("SELECT ARartikelnr ,ARartikelbezeich, ARartwarengruppe,  ARanzahleinheiten, ARinhalteinheiten, ARanzgebindepal FROM BGARTIKEL where ARartikelnr BETWEEN '" + textBox2.Text + "' and '" + textBox3.Text + "' order by ARinhalteinheiten, ARartwarengruppe");

dt = con.QueryEx();

每次我打开一个新表单时,我都会做一个

MyConnection con = new MyConnection();

做很多类似的

con.SqlQuery("Select string")

打开第二个表单后,当我进行新的长选择时,它会冻结。奇怪的是,我使用这两种形式没有问题,但在第一种形式中,我用一个按钮填充了数据网格。现在我更改了是否直接从表单加载中填写。当我转到下一个表单时,我无法在新表单上填写我的其他数据网格,从而给出该错误。

错误:

超时。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。

【问题讨论】:

  • 您应该创建一个连接,使用它,然后处理它。你可能不是。完成后不要再处理您的连接。
  • 既然您知道如何解决手头的问题,您需要阅读、理解并开始使用参数化查询。您发布的是教科书示例,说明了如何不创建查询。你不应该直接执行从最终用户那里收到的文本。

标签: sql-server connection connection-timeout


【解决方案1】:

让您的 MyConnection 类一次性使用。处理完数据后将其丢弃。

  1. 在类上实现 IDisposable 接口

(公共类 MyConnection:IDisposable)

  1. 实现 Dispose 方法来处理您的连接

公共无效处置() { _con.Dispose(); }

  1. 并像这样使用它

使用(MyConnection con = new MyConnection()) { con.SqlQuery("..."); dt = con.QueryEx(); }

【讨论】:

  • 谢谢!这就像一个魅力!感谢您的明确回答!
  • 如果确实有帮助,请将其标记为答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多