接收到错误“;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需要一个打开且可用的连接.连接';s的当前状态为关闭";运行我的应

这个错误解释了一切。调用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();
}