Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#MySQL DataReader while循环中的第二个DataReader_C#_Mysql_Database_Connection_Datareader - Fatal编程技术网

C#MySQL DataReader while循环中的第二个DataReader

C#MySQL DataReader while循环中的第二个DataReader,c#,mysql,database,connection,datareader,C#,Mysql,Database,Connection,Datareader,正如你可能从标题中猜到的那样,我正在尝试这样做: #region check new nations private void checknewnations() { addtolog("server","Checking for new nations"); string sql = "SELECT * FROM " + variables.tbl_nations + " WHERE nations_new=0"; MyS

正如你可能从标题中猜到的那样,我正在尝试这样做:

    #region check new nations
    private void checknewnations()
    {
        addtolog("server","Checking for new nations");
        string sql = "SELECT * FROM " + variables.tbl_nations + " WHERE nations_new=0";
        MySqlCommand cmd = new MySqlCommand(sql, connection);
        MySqlDataReader reader = cmd.ExecuteReader();

        while (reader.Read())
        {
            addtolog("mysql",reader["nations_name"].ToString());

            int nation_ID = int.Parse(reader["nations_ID"].ToString());
            string nation_name = reader["nations_name"].ToString();
            string user_ID = reader["nations_user"].ToString();


            addnation(nation_ID, nation_name, user_ID);
        }
        addtolog("server","Finished checking for new nations.");
        //connection.Close();
        reader.Dispose();
    }
    #endregion
它在while循环中调用:

    #region addnation
    private void addnation(int nationIDnot, string nationName, string userID)
    {
        string nationID = makesixdigits(nationIDnot);
        string userName = "";

        string sql = "SELECT * FROM " + variables.tbl_users + " WHERE users_ID=" + userID;
        MySqlCommand cmd = new MySqlCommand(sql, connection);
        MySqlDataReader reader = cmd.ExecuteReader();


        while (reader.Read())
        {
            userName = reader["users_name"].ToString();
        }
        reader.Dispose();
        addtolog("add", "[" + nationID.ToString() + "] " + nationName + " [" + userID + "] " + userName);
    }
    #endregion

这在第二个代码块(while循环中调用的代码块)中给出了一个错误,表示已经有一个与连接关联的datareader。我该如何让它工作,因为我相信有办法。

在2008年的连接字符串中,您可以通过
MultipleActiveResultSets=true我没有使用mySQL,所以我不确定,但如果您使用的是ADO提供程序,可能会这样


否则,只需建立另一个连接——不要重复使用同一个连接。

DataReader将保持连接,直到它遍历其所有记录为止。试试这个

using(reader)
{
   System.Data.DataTable dt = new System.Data.DataTable();
   dt.Load(reader);

   foreach(DataRow row in dt.Rows)
   {
        addtolog("mysql",row["nations_name"].ToString());

        int nation_ID = int.Parse(row["nations_ID"].ToString());
        string nation_name = row["nations_name"].ToString();
        string user_ID = row["nations_user"].ToString();


        addnation(nation_ID, nation_name, user_ID);
   }
}

这样,两个读卡器不共享同一个连接

在循环中打开另一个连接,并使用它获得第二个读卡器。
由于循环很紧,您可能更愿意在第一个方法中打开两个连接,将第二个连接传递给被调用的方法,然后在第一个(“外部”)方法的末尾关闭它们。通话间隔应足够短,以便尽快关闭连接的正常规则无关紧要。

非常感谢您的回答。这是一个显而易见且简单的解决方案:)MARS与MySQL一起工作吗?我认为它仍然是特定于SQLServer2005和更高版本的。(我通常只使用多个连接,除非我真的需要在同一事务中进行交叉呼叫)。@JonHanna-我认为没有,但MS用户可以阅读这个问题,所以我涵盖了基本内容。观点很好。哦,海MS用户!在使用火星之前阅读。我不是在使用火星的东西,只有多个连接:)3行额外的代码:)这会成为表的本地版本吗?所有记录都会立即加载到
dt
中,读取器是自由的。对于我遇到的一些小结果集场景,将DataReader结果集加载到DataTable中的方法看起来很方便。例如,一个顶级的“Client/Person”行,它有0..n个子行要循环,其中“n”通常是“少数”,即不是“数千”。如果这些子行中的每一行都可能与多个其他表中的0..n个其他数据行相关,则此方法将有助于在不占用连接的情况下循环通过这些第一级子行。感谢您的答复:)我现在使用2个连接,虽然我在程序开始时打开它们,在程序结束时关闭它们,因为第一个while循环也是循环/计时器滴答声的一部分,所以连接几乎经常被使用。@user1599326如果它是一个单线程控制台应用程序,符合lose规范“do db stuff,then end”(!),那就好了;无论如何,没有任何东西可以共享连接池。请记住,它属于弯曲规则的范畴,因为它只是一个小应用程序,可以做一些事情,不会结束;“嘿,我们的方式对可伸缩性有什么影响…”“谁在乎,这个程序在问题结束之前就结束了!”:)好吧,这个程序实际上是设计成一个持续运行的服务器程序(只与MySql数据库连接,而不是直接与客户端连接)在这种情况下,您确实希望在方法开始时创建和打开连接,并在结束时关闭它们(理想情况下使用
,以确保在遇到异常时发生这种情况)。处理并发客户端连接的并发线程(如在服务器应用程序的客户端中)将具有单独的连接(否则,您会在其中一个客户端中遇到与上述相同的异常,并且不知道原因),并且池将使连接开销和总DB连接计数保持较低