【问题标题】:System.InvalidOperationException: 'There is already an open DataReader associated with this Command which must be closed first.'System.InvalidOperationException: '已经有一个打开的 DataReader 与此命令关联,必须先关闭。'
【发布时间】:2018-10-11 23:02:34
【问题描述】:

ps:我尝试关闭连接和数据读取器,但没有成功,还尝试了以前的解决方案,但仍然出现错误 我什至分离了连接,但效果不佳 我在这里要做的是从 sql server 的表中读取一个 id 并使用该 id 在另一个表中查找另一个数据 但它总是给我关闭连接或数据问题

SqlConnection cnx = new SqlConnection("data source = . ; database = tnt ; integrated security = true ; MultipleActiveResultSets=true");
    SqlConnection cnx2 = new SqlConnection("data source = . ; database = tnt ; integrated security = true ; MultipleActiveResultSets=true");



        SqlCommand cmd = new SqlCommand("select matricule from inscription where numformation = @n",cnx);
        cmd.Parameters.AddWithValue("@n", comboBox2.Text);
        SqlDataReader dr = cmd.ExecuteReader();

        List<string> hawhaw = new List<string>();
        while (dr.Read())
        {
            hawhaw.Add(dr[0].ToString());
        }

        cmd.Dispose();

        cnx2.Close();

        cnx2.Open();
        SqlCommand cmd2 = new SqlCommand("select * from person where matricule = @m", cnx2);
        foreach (var item in hawhaw)
        {
            cmd2.Parameters.Clear();
            cmd2.Parameters.AddWithValue("@m", item);
            SqlDataReader dr2 = cmd2.ExecuteReader();

            if (dr2.Read())
            {
                MessageBox.Show(dr2[0].ToString());
            }
        }

        cmd2.Dispose();
        cnx.Close();

【问题讨论】:

  • 问题不是dr。你不断在循环内创建dr2,但你永远不会关闭它。另外,您使用的是相同的Command,但要不断更改参数。
  • 连接、命令、数据读取器(和其他)必须在您完成后处理掉。

标签: c# sql-server ado.net sqldatareader sqlcommand


【解决方案1】:

最重要的是,您可以管理处置和关闭操作。为此,您应该使用 using 并代表您完成这项工作。

   List<string> hawhaw = new List<string>();

            using (SqlConnection connection = new SqlConnection("data source = . ; database = tnt ; integrated security = true ; MultipleActiveResultSets=true"))
            {
                connection.Open();
                using (SqlCommand cmd = new SqlCommand("select matricule from inscription where numformation = @n", connection))
                {
                    cmd.Parameters.AddWithValue("@n", comboBox2.Text);
                    SqlDataReader dr = cmd.ExecuteReader();

                    while (dr.Read())
                    {
                        hawhaw.Add(dr[0].ToString());
                    }

                }
            }



            using (var connection = new SqlConnection("data source = . ; database = tnt ; integrated security = true ; MultipleActiveResultSets=true"))
            {
                connection.Open();

                foreach (var item in hawhaw)
                {
                    using (var cmd2 = new SqlCommand("select * from person where matricule = @m", connection))
                    {
                        cmd2.Parameters.AddWithValue("@m", item);
                        var dr2 = cmd2.ExecuteReader();
                        if (dr2.Read())
                        {
                            MessageBox.Show(dr2[0].ToString());
                        }
                    }

                }
            }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-08-29
  • 1970-01-01
  • 2020-07-16
  • 2012-02-19
  • 1970-01-01
相关资源
最近更新 更多