>백엔드 개발 >C++ >C# 코드에 '이미 열린 DataReader가 있습니다 ...'오류가 발생하는 이유는 무엇입니까?

C# 코드에 '이미 열린 DataReader가 있습니다 ...'오류가 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-29 21:51:09949검색

Why Am I Getting the "이미 열린 DataReader가 있습니다 ..."엔터티 프레임 워크의 오류

문제 해결 이 오류는 "이 명령과 먼저 닫아야하는이 명령과 관련된 열린 데이터 레더가 있습니다."일반적으로 다른 쿼리의 결과가 여전히 처리되는 동안 데이터베이스 쿼리를 실행하려고 시도 할 때 발생합니다. 일반적인 시나리오와 그 솔루션을 살펴 보겠습니다.

문제는 종종 메소드가 더 큰 쿼리의 반복 내에서 데이터베이스 쿼리를 실행하는 중첩 쿼리에서 비롯됩니다. 예를 들어, 메소드를 고려하십시오 : 이 메소드는 최대 값을 검색합니다. 문제는 다른 쿼리 내에서 사용될 때 발생합니다

문의 각 반복은

를 호출하여 새 데이터 리더를 열었습니다. 이 독자들을 닫지 않으면 서 후속 데이터베이스 작업이 실패하여 "Open DataReader"오류로 이어집니다. 두 가지 기본 솔루션이 존재합니다 1. 다중 활성 결과 세트 (mars) 활성화

가장 간단한 솔루션은 종종 연결 문자열에서 화성을 활성화하는 것입니다. 이를 통해 여러 활성 데이터 리더가 동시에 가능합니다. 연결 문자열을 수정하여

: 를 포함하십시오 DateLastUpdated 경고 :

화성은 성능 오버 헤드를 소개 할 수 있으며 항상 복잡한 쿼리를 사용하는 이상적인 솔루션은 아닙니다.
<code class="language-csharp">public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
{
    return (from h in context.AccountHistory
            where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
            select h.LastUpdated).Max();
}</code>
2. 열망하는 하중 구현 보다 효율적이고 종종 선호되는 접근법은 간절한 하중입니다. 중첩 쿼리 대신 엔터티 프레임 워크의 메소드를 사용하여 단일 쿼리에서 필요한 모든 데이터를 가져 오십시오. LastUpdated 이 단일 쿼리는 , 및 데이터를 검색하여 여러 데이터 리더의 필요성을 제거하고 오류를 해결합니다. 열렬한 로딩은 데이터베이스로의 라운드 트립을 줄임으로써 성능을 향상시킵니다. 특정 엔티티 관계에 맞게 문을 조정해야합니다. 필요한 경우 더 깊은 내비게이션에 를 사용하는 것을 고려하십시오.
<code class="language-csharp">return accounts.AsEnumerable()
                .Select((account, index) => new AccountsReport()
                    {
                        // ... other properties ...
                        DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber);
                        // ... other properties ...
                    })
                // ... rest of the query ...</code>
화성과 간절한 로딩 중에서 선택하는 것은 응용 프로그램의 특정 요구와 쿼리 복잡성에 따라 다릅니다. 더 나은 성능과 클리너 코드를 위해서는 일반적으로 열망하는 로딩이 권장되지만, 쿼리를 즉시 실현할 수없는 경우 화성은 빠른 수정을 제공합니다.

.

위 내용은 C# 코드에 '이미 열린 DataReader가 있습니다 ...'오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.