C#:已经有一个与此命令关联的打开的DataReader,必须先关闭它

C#:已经有一个与此命令关联的打开的DataReader,必须先关闭它,c#,sql,sql-server,sqldatareader,C#,Sql,Sql Server,Sqldatareader,上面是我的代码:我使用了两个SQLDataReader,一个在另一个中 我在while循环结束时得到错误 :已存在与此命令关联的打开的DataReader,必须先关闭该命令 有人能帮忙吗? 谢谢。试试这段代码 String sql = "SELECT * from mybrknElements; "; String sql2 = ""; String sWord = "" ; String sNum = "" ; i

上面是我的代码:我使用了两个SQLDataReader,一个在另一个中 我在while循环结束时得到错误 :已存在与此命令关联的打开的DataReader,必须先关闭该命令

有人能帮忙吗? 谢谢。

试试这段代码

        String sql = "SELECT * from mybrknElements; ";
        String sql2 = "";
        String sWord = "" ;
        String sNum = "" ;
        int nWords = 0;
        cnn.Close();
        cnn.Open();
        SqlCommand command = new SqlCommand(sql, cnn);
        cnn2.Close();
        cnn2.Open();

        SqlDataReader drb;
        drb = command.ExecuteReader();
        while (drb.Read())
        {
            sNum = drb["ID"].ToString();
            sWord = drb["Element"].ToString();
            MessageBox.Show("OUTER loooop sNum = " + sNum + " sWord = " + sWord);


            sql2 = "SELECT * from mybrknElements2; ";
            String sWord2 = "" ;
            String sNum2 = "";
            SqlCommand command22 = new SqlCommand(sql2, cnn2);

            SqlDataReader drcc;
            drcc = command22.ExecuteReader(); //ERROR comes up after this line 


            while (drcc.Read())
            {
                sNum2 = drcc["ID"].ToString();
                sWord2 = drcc["Element"].ToString();
                if (Equals(sWord2,sWord2))
                {

                    nWords = nWords + 1;
                    MessageBox.Show("sNum2 = " + sNum2 + " sWord2 = " + sWord2);
                }
            }



            //---check occurances--------------


        }

您应该停止重用您的命令和连接对象,并在使用它们之后正确地处理它们。重用对象没有任何好处(.NET无论如何都会通过连接池重用数据库的开放套接字,即使对于不同的连接对象也是如此),它只会导致类似这样的问题

因此,如果不重用对象并正确处理对象,您的代码可能会出现以下情况:

        SqlDataReader drb;
        drb = command.ExecuteReader();
        while (drb.Read())
        {
            sNum = drb["ID"].ToString();
            sWord = drb["Element"].ToString();
            MessageBox.Show("OUTER loooop sNum = " + sNum + " sWord = " + sWord);


            sql2 = "SELECT * from mybrknElements2; ";
            String sWord2 = "" ;
            String sNum2 = "";
            SqlCommand command22 = new SqlCommand(sql2, cnn2);

            SqlDataReader drcc;
            drcc = command22.ExecuteReader(); //ERROR comes up after this line 

          drb.Close();

            while (drcc.Read())
            {
                sNum2 = drcc["ID"].ToString();
                sWord2 = drcc["Element"].ToString();
                if (Equals(sWord2,sWord2))
                {

                    nWords = nWords + 1;
                    MessageBox.Show("sNum2 = " + sNum2 + " sWord2 = " +   sWord2);
                 }
               }
            drcc.Close();
          }
注意:在每个数据读取器中,您只使用两列,因此我已将这些列添加到每个SQL语句的select列表中,这样您就不会不必要地检索永远不会使用的数据

但是,我觉得整个循环毫无意义,效率低下,假设其全部目的是获取具有正确数字的
nWords
,您可以在SQL中完成这一切:

string sql = "SELECT ID, Element FROM mybrknElements; ";
string sql2 = "SELECT ID, Element FROM mybrknElements2;";
int nWords = 0;
string connectionString = "Your Connection String";

using (var connection = new SqlConnection(connectionString))
using (var command = new SqlCommand(sql1, connection))
{
    connection.Open();
    using (var reader = command.ExecuteReader())
    {
        string sWord = reader.GetString(0);
        string sNum = reader.GetString(1);

        using (var connection2 = new SqlConnection(connectionString))
        using (var command2 = new SqlCommand(sql2, connection2))
        {
            connection2.Open();
            using (var reader2 = command2.ExecuteReader())
            {
                string sWord2 = reader2.GetString(0);
                string sNum2 = reader2.GetString(1);

                if (Equals(sWord1,sWord2))
                {
                    nWords++;
                }
            }
        }           
    }
}

与错误无关,但您的意思是如果(等于(sWord2,sWord2))?我想您可能希望
if(Equals(sWord1,sWord2))
同时只能打开一个datareader在一个连接上不能有多个打开的datareader。
    SELECT  nWords = COUNT(*)
    FROM    mybrknElements AS e
            INNER JOIN mybrknElements AS e2
                ON e2.ID = e.ID;