asp.net ExecuteReader需要一个开放且可用的连接。连接的当前状态是开放的

时间:2015-11-03 10:52:16

标签: c# sql asp.net

用c#.net编写的我的ERP Web应用程序经常抛出此错误

enter image description here

我在App_Code文件夹下有Globals.cs文件,如:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Data.SqlClient;
using System.Data.Sql;

public static class Globals
{
public static string mycon = ConfigurationManager.ConnectionStrings["WebConnStr"].ConnectionString;
public static SqlConnection con = new SqlConnection(mycon);
public static SqlCommand cmd = new SqlCommand();
public static SqlDataReader dr;

public static void Initialize(string CmdType, string CmdText)
{
    try
    {
        if (con.State == ConnectionState.Open)
        {
            con.Close();
        }
        con.Open();
        cmd.Connection = con;
        if (CmdType == "StoredProcedure")
        {
            cmd.CommandType = CommandType.StoredProcedure;
        }
        else
        {
            cmd.CommandType = CommandType.Text;
        }
        cmd.CommandText = CmdText;
        cmd.Parameters.Clear();
    }
    catch (Exception ex)
    {
    }

}
}

web.config中的连接字符串如下所示:

<connectionStrings>
<add name=WebConnStr connectionString="Data Source=servername;Initial Catalog=dbname;User ID=username; Password=12345" providerName="System.Data.SqlClient"/>
</connectionStrings>

我的示例aspx.cs代码如:

Gridview绑定:

DataTable dt = new DataTable();
Globals.Initialize("StoredProcedure", "[sp_getemp]");
Globals.dr = Globals.cmd.ExecuteReader();
dt.Load(Globals.dr);
GridView1.DataSource = dt;
GridView1.DataBind();

插入查询:

Globals.Initialize("StoredProcedure", "[sp_insertemp]");
Globals.cmd.Parameters.AddWithValue("@EmpID", txtempid.Text);
Globals.cmd.ExecuteNonQuery();

数据阅读:

private string GetEmpName(string empcode)
{
    Globals.Initialize("Text", "SELECT EmpName from tbl_emp where EmpID=@EmpID");
    Globals.cmd.Parameters.AddWithValue("@EmpID", empcode);
    Globals.dr = Globals.cmd.ExecuteReader();
    if (Globals.dr.Read() == true)
    {
        return Globals.dr["EmpName"].ToString();
    }
    else
    {
        return "";
    }
}

我是否知道Globals.cs文件中可能出现的问题以及如何解决?

2 个答案:

答案 0 :(得分:1)

这就是为什么你应该使用using语句来摆脱这种类型的错误。像

这样的东西
using (SqlConnection connection = new SqlConnection(connectionString))
{
   //some code
}

您可以参考此MSDN并阅读有关连接池的信息:

  

实际上,大多数应用程序只使用一种或几种不同的应用程序   连接配置。这意味着在申请期间   执行时,将重复打开许多相同的连接   关闭。为了最大限度地降低打开连接的成本,ADO.NET使用了   优化技术称为连接池。

     

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

答案 1 :(得分:0)

看起来您需要在执行代码之前打开连接,例如conn.Open();