2012-08-14 4 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 

가 :

#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가 있다는 오류가 발생했습니다. 어떻게하면 효과가 있는지 어떻게 알 수 있을까요?

답변

1

2008 년 연결 문자열에서 MultipleActiveResultSets=true;을 통해 여러 활성 결과 집합을 가질 수 있습니다. 확실하지는 않지만 어쨌든 ADO 공급자를 사용하는 경우 mySQL을 사용하지 않았습니다.

그렇지 않으면 다른 연결을 만드십시오. 동일한 것을 다시 사용하지 마십시오.

+0

대단히 감사합니다. 그것은 분명하고 쉬운 해결책입니다 :) – Dirk

+0

MARS는 MySQL과 함께 작동합니까? 나는 그것이 SQLServer 2005 이상에서만 여전히 존재한다고 생각했다. (나는 같은 트랜잭션에서 인터리빙 호출을해야 할 필요가 없다면 대부분 연결을 사용한다.) –

+0

@ 존 한나 - 나는 그랬다고 생각하지는 않았지만 MS 사용자가이 질문을 읽었을 때베이스를 다룰 수있었습니다. – Hogan

3

DataReader는 모든 레코드를 반복 할 때까지 연결을 유지합니다. 두 독자가 동일한 연결

+0

그게 로컬 버전의 테이블을 만들겠습니까? – Dirk

+0

모든 레코드가 즉시 'dt'에로드되고 판독기는 무료입니다. – codingbiz

+0

고맙습니다. – Dirk

1

를 열고 루프에서 다른 연결을 공유하지 않는이

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

답장을 보내 주셔서 감사합니다 :) 처음에는 while 루프도 루프/timer_tick의 일부분이기 때문에 프로그램의 시작 부분에 이들을 열고 프로그램의 마지막 부분에서 닫을지라도 2 개의 연결을 사용하고 있습니다. 연결은 거의 항상 사용됩니다. – Dirk

+1

@ user1599326 "do db stuff, then end"의 사양에 맞는 단일 스레드 콘솔 응용 프로그램이라면 괜찮습니다. 어쨌든 연결 풀을 공유하는 다른 방법은 없습니다. –

+0

다시 한번 감사드립니다 :) – Dirk

관련 문제