在DataReader的C#MySQL的第二DataReader的while循环(C# MySQL

2019-06-27 01:31发布

正如你可能已经从标题猜到我是想这样做:

    #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的。 我是如何得到这个工作,因为我相信,有一种方法。

Answer 1:

2008年的连接字符串,你可以有通过多个活动结果集MultipleActiveResultSets=true; 我没有用MySQL的,所以我不知道,但也许如果您使用的是ADO提供商。

否则,只是让另一个连接 - 不要重复使用同一个。



Answer 2:

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);
   }
}

这样,两个读者之间不共享相同的连接



Answer 3:

打开在环另一个连接,并用它来获得第二读卡器。 由于环比较紧,你可能更喜欢在第一种方法来打开两个连接,通过传递第二调用方法,然后在第一个(“外”)方法结束时关闭他们两个。 它应该是通话,大约关闭连接尽快正常的规则都不会有问题之间的足够短的时间。



文章来源: C# MySQL second DataReader in DataReader while loop