用c#.net编写的我的ERP Web应用程序经常抛出此错误
我在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文件中可能出现的问题以及如何解决?
答案 0 :(得分:1)
这就是为什么你应该使用using
语句来摆脱这种类型的错误。像
using (SqlConnection connection = new SqlConnection(connectionString))
{
//some code
}
您可以参考此MSDN并阅读有关连接池的信息:
实际上,大多数应用程序只使用一种或几种不同的应用程序 连接配置。这意味着在申请期间 执行时,将重复打开许多相同的连接 关闭。为了最大限度地降低打开连接的成本,ADO.NET使用了 优化技术称为连接池。
连接池减少了新连接的次数 必须打开。平民保持对物质的所有权 连接。它通过保持一组活动来管理连接 每个给定连接配置的连接。每当一个用户 调用在连接上打开,pooler查找可用的 池中的连接。如果池连接可用,则为 将其返回给调用者而不是打开新连接。当。。。的时候 应用程序调用关闭连接,pooler将其返回 合并的一组活动连接而不是关闭它。一旦 连接返回到池中,它已准备好在池上重用 下一次公开电话。
答案 1 :(得分:0)
看起来您需要在执行代码之前打开连接,例如conn.Open();