【发布时间】:2014-09-15 05:25:39
【问题描述】:
我在一个方法上有这个代码:
DataGrid2.DataSource = Show1(Convert.ToInt32(Request.QueryString["Cr"]));
DataGrid2.DataBind();
这是分配给数据源的 show 方法:
static SqlConnection sqlConntest = new SqlConnection( ConfigurationSettings .AppSettings["conn"].ToString ());
public static SqlDataReader Show1(int cr)
{
SqlDataReader dr;
SqlCommand cmd = new SqlCommand();
cmd.Connection = sqlConntest;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp1";
cmd.Parameters.Add("@Cr", SqlDbType.Int);
cmd.Parameters["@Cr"].Value = crewID;
sqlConntest.Open();
dr = cmd.ExecuteReader();
return dr;
}
当我运行程序时,我收到错误消息:
“ExecuteReader 需要一个打开且可用的连接。连接的当前状态为关闭”
为什么会发生这种情况,我该如何解决? 谢谢。
【问题讨论】:
-
sqlConntest.open();在 ExecuteReader 之前? -
也许我投票太早了,无法关闭重复。但是,另一个问题可能还是有用的,因为您还在 ASP.NET 中使用静态连接。不确定它是否能解决您的问题。
-
@Pyram 是的,您将在 使用后打开连接。因此,我的评论指出之前
-
@pyram:也使用
using-statement 来尽快关闭连接。您还应该使用using处理SqlDataReader和SqlCommand。 -
@pyram:我认为这是由于现在连接在此方法中关闭(这很好)。但是由于您使用数据读取器作为在方法之外使用的数据源(在
DataGrid2.DataBind()),您会遇到异常。我会简单地使用SqlDataAdapter来填充DataTable,将其返回并用作DataSource。它只是一个内存中的对象,不需要打开连接。
标签: asp.net executereader