2015-11-03 347 views
0

我的ERP网络写在C#.NET引发此错误应用程序频繁asp.net ExecuteReader需要一个开放且可用的Connection。该连接的当前状态是开放

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 [email protected]"); 
    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文件,以及如何出了错我是否修复它?

+1

什么是错误的是,你的代码是*绝对可怕*。请至少阅读连接池。 –

+0

错误消息告诉您需要打开且可用的连接,并且连接状态已打开。我想这意味着连接不可用。 –

+0

请查看提供的链接。这与你面临的情况几乎相同。不要卡住“打开”和“连接”字样.. –

回答

0

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

0

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

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    //some code 
} 

东西,你可以参考这个MSDN和阅读有关连接池:

在实践中,大多数应用程序只使用一个或几个不同 配置的连接。这意味着在执行应用程序 时,许多相同的连接将被重复打开并关闭 。为了最小化开放连接的成本,ADO.NET使用称为连接池的优化技术 。

连接池减少了必须打开新连接 的次数。共同池持有物理连接的所有权。它通过为每个给定的连接配置保持一组活动的 连接来管理连接。只要用户 在连接上调用Open,池就会在池中查找可用的 连接。如果有一个池连接可用,它将 返回给调用者,而不是打开一个新的连接。当 应用程序在连接上调用Close时,池会将其返回到 活动连接的池集,而不是关闭它。一旦 连接返回到池中,它就准备好在 下一次打开呼叫时重新使用。

相关问题