接收到错误“;ExecuteReader需要一个打开且可用的连接.连接';s的当前状态为关闭";运行我的应
本文关键字:连接 状态 我的 运行 quot ExecuteReader 错误 一个 | 更新日期: 2023-09-27 18:25:39
我正试图通过从下拉列表中选择站点ID来在数据库的文本框中显示一些值。下拉列表运行良好,显示了存储在数据库中的站点ID。运行此应用程序时,它显示一个错误:
执行读取器需要一个打开且可用的连接。连接的当前状态为关闭。
代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
LoadOption();
}
}
private void LoadOption()
{
DataTable dt = new DataTable();
SqlConnection con = new SqlConnection(@"connectionString");
using (con)
{
SqlDataAdapter adpt = new SqlDataAdapter("SELECT Site_ID FROM tbl_Survey1", con);
adpt.Fill(dt);
ddlSiteID.DataSource = dt;
ddlSiteID.DataTextField = "Site_ID";
ddlSiteID.DataValueField = "Site_ID";
ddlSiteID.DataBind();
ddlSiteID.Items.Insert(0, new ListItem("--Select ID--", ""));
}
}
protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(@"connectionString");
string selectID = ddlSiteID.SelectedValue;
SqlCommand cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where Site_ID=@Site_ID", con);
cmd.Parameters.AddWithValue("@Site_ID", selectID);
cmd.CommandType = CommandType.Text;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
rdr.Read();
txtSiteName.Text = rdr.GetString(0);
txtSiteAddress.Text=rdr.GetString(1);
}
}
}
}
来源:
<asp:DropDownList ID="ddlSiteID" runat="server" AutoPostBack="True" OnSelectedIndexChanged="ddlSiteID_SelectedIndexChanged">
</asp:DropDownList>
<asp:TextBox ID="txtSiteName" runat="server"></asp:TextBox>
<asp:TextBox ID="txtSiteAddress" runat="server"></asp:TextBox>
这个错误解释了一切。调用ExecuteReader时,您的连接已关闭。但我想你是在问为什么?。
你认为,因为你已经加载了下拉列表,所以你可以毫无问题地执行你的阅读器。但是,不幸的是,SqlDataAdapter
在处理连接时有自己的行为。
从MSDN SqlDataAdapter.Fill
Fill方法使用SELECT从数据源检索行由关联的SelectCommand属性指定的语句。这个与SELECT语句关联的连接对象必须有效,但它不需要是开放的。如果连接在调用Fill,打开它以检索数据,然后关闭它。如果在调用Fill之前,连接处于打开状态,它将保持打开状态。
所以你只需要以这种方式打开连接
protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
{
string selectID = ddlSiteID.SelectedValue;
using(SqlConnection con = new SqlConnection(@"connectionString"))
using(SqlCommand cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where Site_ID=@Site_ID", con))
{
con.Open();
cmd.Parameters.AddWithValue("@Site_ID", selectID);
cmd.CommandType = CommandType.Text;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
....
}
}
}
附言:请记住,始终将一次性对象(如连接、命令和读取器)放在Using块中,以确保它们已关闭并正确处理,也可在出现异常时使用
您在第二个方法中缺少一个打开连接的显式调用:
con.Open();
此外,你不会处理上述连接——要小心。对任何实现IDisposable
:的内容使用using
protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
{
using (SqlConnection con = new SqlConnection(@"connectionString"))
{
con.Open();
string selectID = ddlSiteID.SelectedValue;
using (SqlCommand cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where Site_ID=@Site_ID", con))
{
cmd.Parameters.AddWithValue("@Site_ID", selectID);
cmd.CommandType = CommandType.Text;
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
rdr.Read();
txtSiteName.Text = rdr.GetString(0);
txtSiteAddress.Text=rdr.GetString(1);
}
}
}
}
}
在ddlSiteID_SelectedIndexChanged
方法中调用ExecuteReader
之前,您应该先调用con.Open()
来打开连接。最后别忘了把它关上。
这意味着你的代码可能看起来像
protected void ddlSiteID_SelectedIndexChanged(object sender, EventArgs e)
{
using(var con = new SqlConnection(@"connectionString"))
{
string selectID = ddlSiteID.SelectedValue;
using (var cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where Site_ID=@Site_ID", con))
{
cmd.Parameters.AddWithValue("@Site_ID", selectID);
cmd.CommandType = CommandType.Text;
con.Open();
try
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
rdr.Read();
txtSiteName.Text = rdr.GetString(0);
txtSiteAddress.Text=rdr.GetString(1);
}
}
}
finally
{
con.Close();
}
}
}
}
尝试DropDown的In SelectedIndexChanged
事件。
SqlCommand
要求连接为open
SqlConnection con = new SqlConnection(@"connectionString");
string selectID = ddlSiteID.SelectedValue;
SqlCommand cmd = new SqlCommand("SELECT Site_Name,Site_Address FROM tbl_Survey1 where Site_ID=@Site_ID", con);
cmd.Parameters.AddWithValue("@Site_ID", selectID);
cmd.CommandType = CommandType.Text;
con.open
{
using (SqlDataReader rdr = cmd.ExecuteReader())
{
if (rdr.HasRows)
{
rdr.Read();
txtSiteName.Text = rdr.GetString(0);
txtSiteAddress.Text=rdr.GetString(1);
}
}
}
}
con.close();
检查您的连接是否打开。
if (con != null && con.State == ConnectionState.Closed)
{
con.Open();
}