'连接没有关闭。连接的当前状态是打开的。

时间:2018-02-10 12:51:30

标签: c# sql-server database

我从昨天起就遇到了这个问题,我尝试了很多解决方案,但没有任何效果

当我做con.close();

时,它一直告诉我连接统计信息已打开
 private void cashier_Load(object sender, EventArgs e)
    {
        int a;
        con.Open();
        string query = "Select Max (invno) From Invoicesdata";
        cmd = new SqlCommand(query, con);
        SqlDataReader reader;
        reader = cmd.ExecuteReader();
        if (reader.Read())
        {
            string val = reader[0].ToString();
            if (val == "")
            {
                Invoicenm.Text = "1";
            }
            else
            {
                a = Convert.ToInt32(reader[0].ToString());
                a = a + 1;
                Invoicenm.Text = a.ToString();
            }
        }
        con.Close(); //I did connection close but nope 
        receiptgrid.Rows.Clear();
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        cmd = new SqlCommand("SELECT * FROM Products WHERE Item_Code = @BarCode", con);
        cmd.Parameters.Add(new SqlParameter("@BarCode", Productstxt.Text));
        con.Open();      //here I am facing the problem
        SqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {

            foreach (DataGridViewRow row in receiptgrid.Rows)

这是我的连接字符串SqlConnection con =new SqlConnection("Data Source=strongspider.ddns.net;Initial Catalog=POS;Persist Security Info=True;User ID=sa;Password=****Password**"); // <== this is the (POS) Database.

3 个答案:

答案 0 :(得分:2)

我建议您遵循“开放迟到,提前关闭”模式,而不是共享相同的连接并包裹在using块中。这将确保关闭连接,并且无需您显式调用Close并利用连接池。

using(var con = new SqlConnection(connectionString))
using(var cmd = new SqlCommand(query, con))
{
    //do command stuff here
}

答案 1 :(得分:0)

用尽所有非逻辑序列,并使用SqlConnection.State

保持安全

所以不要使用

 con.Open();

使用: -

if (con.State == con.Closed)
{
    con.Open();
}

答案 2 :(得分:0)

由于您使用的是全局连接变量,因此无法管理连接状态。

尝试在需要的地方移动连接对象的声明和用法。 并使用using{}块来连接和SqlDataReader个对象。

这将使您免于明确要求关闭连接

private void cashier_Load(object sender, EventArgs e)
{
    int a;
    using(var conn = new SqlConnection(YOURCINNECTIONSTRING))
    {
        con.Open();
        string query = "Select Max (invno) From Invoicesdata";
        var cmd = new SqlCommand(query, con);
        using(SqlDataReader reader = cmd.ExecuteReader())
         {
             if (reader.Read())
             {


             }
         }
      }
}