2014-08-28 1 views
0

ASP.NET에서 SQL을 사용할 때 서로 다른 명령과 결과 집합을 앞뒤로 전환하려고 할 때 항상이 문제가 있습니다. 코드 :이미 열려있는 DataReader입니다. MARS가 true로 설정되었습니다.

내 연결 문자열이 MultipleActiveResultSets=true;를 사용할 수있다
foreach (string user in usernames) 
{ 
    command.CommandText = "select case system_role when 'Z' then 'none' else 'none' end as 'system_role', case institution_roles_pk1 when 1 then 'student' when 2 then 'faculty' end as 'institution_role',batch_uid,user_id,student_id as 'passwd',firstname,middlename,lastname,email,student_id,case row_status when 0 then 'ENABLED' when 2 then 'DISABLED' end as 'row_status' from users where user_id = '" + user + "'"; 

    SqlDataReader reader = command.ExecuteReader(); 

    if (reader.HasRows) 
    { 
     while (reader.Read()) 
     { 
      file.WriteLine(user + "|" + status); 

      if (overrideFramework == 0) 
      { 
       command.CommandText = "use sis_comparison_data insert into person_override values ('" + reader["system_role"].ToString() + "','" + reader["institution_role"].ToString() + "','" + reader["batch_uid"].ToString() + "','" + reader["user_id"].ToString() + "','" + reader["passwd"].ToString() + "','" + reader["firstname"].ToString() + "','" + reader["middlename"].ToString() + "','" + reader["lastname"].ToString() + "','" + reader["email"].ToString() + "','" + reader["student_id"].ToString() + "','" + overrideIndicator + "')"; 

       command.ExecuteNonQuery(); 
      } 

      validPersonCounter++; 

      using (StreamWriter historyFile = new StreamWriter(@"c:\bb_updates\history.txt", true)) 
      { 
       historyFile.WriteLine(this.firstName + status.ToLower() + " user ID for " + user + ", SIS Integration Override: " + didOverride + ", Date: " + mn + "/" + dy + "/" + yy + " Time: " + DateTime.Now.ToString("h:mm:ss tt")); 
      } 
     } 
    } 
    else 
    { 
     invalidPersons.Add(user); 
    }         
} 

, 그때 나는 오류 리더

을 폐쇄하는 동안 읽을 수있는

잘못된 시도를 얻을 command.ExecuteNonQuery() 전에 가까운를 추가하려고했습니다

reader.Close()을 다른 곳에두면 이미 열려있는 데이터 판독기 오류가 발생합니다. 제발 조언.

답변

2

command 개체를 다시 사용하면 안됩니다. 그렇게하면 ExecuteReader 호출의 결과에 방해가됩니다. 대신 while 루프 안에 SqlCommand을 새로 만드십시오.

1

다음을 시도하십시오. reader을 올바르게 처리하고 command을 다시 사용하지 않습니다.

foreach (string user in usernames) 
{ 
    command.CommandText = "select case system_role when 'Z' then 'none' else 'none' end as 'system_role', case institution_roles_pk1 when 1 then 'student' when 2 then 'faculty' end as 'institution_role',batch_uid,user_id,student_id as 'passwd',firstname,middlename,lastname,email,student_id,case row_status when 0 then 'ENABLED' when 2 then 'DISABLED' end as 'row_status' from users where user_id = '" + user + "'"; 
    using (var reader = command.ExecuteReader()) 
    { 
     if (reader.HasRows) 
     { 
      while (reader.Read()) 
      { 
       file.WriteLine(user + "|" + status); 
       if (overrideFramework == 0) 
       { 
        var cmd = new SqlCommand(); 

        cmd.CommandText = "use sis_comparison_data insert into person_override values ('" + reader["system_role"].ToString() + "','" + reader["institution_role"].ToString() + "','" + reader["batch_uid"].ToString() + "','" + reader["user_id"].ToString() + "','" + reader["passwd"].ToString() + "','" + reader["firstname"].ToString() + "','" + reader["middlename"].ToString() + "','" + reader["lastname"].ToString() + "','" + reader["email"].ToString() + "','" + reader["student_id"].ToString() + "','" + overrideIndicator + "')"; 

        cmd.ExecuteNonQuery(); 
       } 

       validPersonCounter++; 

       using (StreamWriter historyFile = new StreamWriter(@"c:\bb_updates\history.txt", true)) 
       { 
        historyFile.WriteLine(this.firstName + status.ToLower() + " user ID for " + user + ", SIS Integration Override: " + didOverride + ", Date: " + mn + "/" + dy + "/" + yy + " Time: " + DateTime.Now.ToString("h:mm:ss tt")); 
       } 
      } 

     } 
     else 
     { 
      invalidPersons.Add(user); 
     } 
    } 
} 
관련 문제