指定我的 conn.open 和 conn.Close 有问题

本文关键字:conn Close 有问题 open 我的 | 更新日期: 2023-09-27 18:37:02

这就是我两次选择某些内容的方式,当我进入中间进行选择时,选择文件上的某些内容会给我带来麻烦。

我从未见过的问题,

我认为这是conn.open()Conn.Close()

我的代码如下所示:

int prisId = Convert.ToInt32(Request.QueryString["Id"]);
cmd.Parameters.AddWithValue("@ppId", prisId);
cmd.CommandText = "SELECT priser FROM Priser WHERE Id = @ppId;";
conn.Open();
SqlDataReader readerPriser = cmd.ExecuteReader();
if (readerPriser.Read())
{
    PanelerrorHandelsbetingelser.Visible = false;
    string Brugerid = Session["id"].ToString();
    cmd.Parameters.AddWithValue("@brugerid", Brugerid);
    cmd.CommandText = "SELECT id, brugernavn, fornavn, efternavn FROM brugere WHERE Id = @brugerid;";
    SqlDataReader readerBrugerid = cmd.ExecuteReader();
    if (readerPriser.Read())
    {
        Session["id"] = readerBrugerid["id"].ToString();
        Session["brugernavn"] = readerBrugerid["brugernavn"].ToString();
        Session["fornavn"] = readerBrugerid["fornavn"].ToString();
        Session["efternavn"] = readerBrugerid["efternavn"].ToString();
        Session["adresse"] = TextBoxAdresse.Text;
        Session["post"] = TextBoxPost.Text;
        Session["telefon"] = TextBoxTelefon.Text;
        Session["prisen"] = readerPriser["priser"].ToString();
        LabelErrorBuyNow.Text = " - Yeaaa Jesper!";
    }
    else
    {
        LabelErrorBuyNow.Text = " - Der findes intet med dit brugerid!";
    }
}
conn.Close();

问题出现在第 9-10 行之后

问题是我似乎犯了一个错误:已经有一个与此命令关联的打开的 DataReader,必须先关闭它。

指定我的 conn.open 和 conn.Close 有问题

永远记得在使用资源后释放资源。因此,在方法结束时,您应该:

cmd.Parameters.Clear();
readerPriser.Close();
conn.Close();
异常会

告诉您到底出了什么问题。您尝试在同一连接上运行两个 SqlDataReader,而没有在连接字符串中指定 MultipleActiveResultSets=True,或者首先关闭第一个读取器。

您有三种选择:

  1. 使用第二个连接运行第二个 SqlDataReader。
  2. 将"MultipleActiveResultSets=True"添加到连接字符串。
  3. 在使用第二个 SqlDataReader
  4. 之前关闭第一个 SqlDataReader。

您需要首先关闭阅读器Priser。
readerPriser.Close();
然后将相同的命令与下一个读取器关联。
使用阅读器后始终关闭它们。

这里有两个问题。首先,您不会将所有IDisposable对象放入using块中。其次,您将对不同的查询重复使用相同的SqlCommand。第三,您的第二个Read电话使用了错误的SqlDataReader

尝试

using (SqlConnection conn = new SqlConnection(...)){
    conn.Open();
    using (SqlCommand selectPriser = new SqlCommand("SELECT priser FROM Priser WHERE Id = @ppId;", conn))
    {
        selectPriser.Parameters.AddWithValue("@ppId", prisId);
        using (SqlDataReader readerPriser = selectPriser.ExecuteReader())
        {
            if (readerPriser.Read())
            {
                // ...
                using (SqlCommand selectBrugere = new SqlCommand("SELECT id, brugernavn, fornavn, efternavn FROM brugere WHERE Id = @brugerid;"){
                    string Brugerid = Session["id"].ToString();
                    selectBrugere.Parameters.AddWithValue("@brugerid", Brugerid);
                    using (SqlDataReader readerBrugerid = selectBrugere.ExecuteReader()){
                        if (readerBrugerid.Read()){
                            // ...
                        }
                    }
                }
            }
        }
    }
}