2012-08-14 66 views
3

正如你可能已经从标题猜到我在想这样做:C#MySQL的第二DataReader的while循环

#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循环中调用的那个代码块)中有一个错误,表示已经有一个与该连接关联的数据读取器。我如何才能使这个工作,因为我确信有一种方法。

回答

1

在2008年的连接字符串中,您可以通过MultipleActiveResultSets=true;拥有多个活动结果集我还没有使用mySQL,所以我不确定,但是如果您使用的是ADO提供程序。

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

+0

非常感谢你的回答。这是一个显而易见的解决方案:) – Dirk 2012-08-14 22:37:39

+0

MARS是否与MySQL一起工作?我认为它仍然是特定于SQLServer 2005和更高版本的。 (我主要是使用多个连接,除非我真的需要在同一个事务中交叉调用。 – 2012-08-14 22:46:57

+0

@JonHanna - 我不这么认为,但MS用户可以阅读这个问题,所以我介绍了基础。 – Hogan 2012-08-14 22:51:35

3

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

这样两个阅读器之间不共享相同的连接

+0

这会使表的本地版本? – Dirk 2012-08-14 22:38:12

+0

所有记录一次加载到'dt'并且读者可以免费 – codingbiz 2012-08-14 22:41:38

+0

好的谢谢:) – Dirk 2012-08-14 22:43:48

1

打开在环另一个连接,并用它来获得第二读卡器。 由于循环太紧,您可能更愿意在第一个方法中打开两个连接,将第二个连接传递给调用的方法,然后在第一个(“外部”)方法结束时关闭它们。在呼叫之间应该有足够短的时间,尽快关闭连接的正常规则无关紧要。

+0

谢谢你的回复:)我现在使用了2个连接,虽然我在程序开始时打开它们,并在程序结束时关闭它们,因为第一个while循环也是循环/ timer_tick的一部分,所以连接几乎不断使用。 – Dirk 2012-08-14 22:42:38

+1

@ user1599326如果它是一个单线程控制台应用程序,符合“do db stuff,then end”(!)的丢失规范,那么这很好;无论如何,没有其他任何人共享连接池。 – 2012-08-14 22:44:25

+0

再次感谢您:) – Dirk 2012-08-14 22:46:34