2010-02-24 1 views
1

ASP.NET MVC 응용 프로그램에서 사용자 지정 멤버 자격 공급자를 사용하고 있습니다. 우리는 간헐적 인 'System.InvalidOperationException -이 명령과 관련된 열린 DataReader가 먼저 닫혀 있어야합니다.' 클래스 문제 때문에 MARS를 사용하도록 결정했습니다. 키워드는 지원되지 않습니다 : 지원되지 않는 키워드 MultipleActiveResultSets

<add name="CustomMembershipServices" connectionString="User ID=CUSTOM_USER;Password=pwd;Database=OUR_DB;Server=.\SQLEXPRESS;MultipleActiveResultSets=true;" providerName="System.Data.SqlClient" /> 

우리의 코드는 이제 경우 ArgumentException을 던졌습니다 ... 웹 설정에서 연결 문자열입니다 .. 다음 줄에 'multipleactiverecordsets'

protected void CreateAndOpenConnection() 
{ 
    // Exception thrown here... 
    _connection = new SqlConnection(_connectionString); 
    _connection.Open(); 
} 

SQL2005 Express 및 SQL2008 Standard Edition을 대상으로 할 때도 동일한 예외가 발생합니다. 어떤 제안? 여기 AdaTheDev에 대한 응답으로

내가이 동일한 연결에서 여러 데이터 리더를 만드는 것이 어떤 이유를 볼 수있는 데이터 판독기를 사용하는 방법 ...

public bool CheckUserPassword(long userID, string password) 
{ 
    bool success = false; 

    if (!string.IsNullOrEmpty(password)) 
    { 
     try 
     { 
      CreateAndOpenConnection(); 

      using (SqlCommand cmd = CreateSqlCommandForStoredProcedure("CheckPassword")) 
      { 
       IPasswordUtility generator = new PasswordUtility(); 

       cmd.Parameters.AddWithValue("UserID", userID); 
       cmd.Parameters.AddWithValue("Password", generator.HashPassword(password)); 

       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        success = reader.HasRows; 

        reader.Close(); 
       } 
      } 
     } 
     finally 
     { 
      CloseConnection(); 
     } 
    } 

    return success; 
} 

입니다.

+0

흠, 내 대답을 업데이트 한 ... 정적 싱글로 내 수업의 치료는 ASP.NET 제공자 프레임 워크 때문이다. 해당 코드에서 아무 것도 잘못 볼 수 없습니다. – AdaTheDev

답변

2

실용적인 이유로 MARS가 실제로 필요하지 않는 한 내 추천은 근본적인 문제에 집중하는 것입니다. 클래스의 예상/의도 된 동작이 여러 데이터 보관함을 열지 않는 것처럼 들립니다. 동시에 단일 연결에 대해

그런 경우, 동일한 연결에서 다른 데이터가 열리기 전에 데이터 보관함이 제대로 닫혔는지 확인해야합니다. 이는 수행되지 않는 상황이있는 것처럼 들립니다. 해결 방법으로 MARS를 사용하면 제대로 닫히지 않는 무언가가 남게됩니다.

편집 1 : 그 코드가 어떤 멀티 스레딩 공유 _connection 객체의 사용을 통해 문제의 원인이 일어나고있다 않는 등 DataReaders에를 삭제 측면에서 나에게 확인을 보입니까? (나는 이것이 사실 인 것을 의심하고있다). 수업 중에 데이터 보관함을 닫지 않는 다른 방법이 있습니까?

+0

원래 질문에 더 많은 코드를 추가했습니다. –