2009-08-19 4 views
0

동적으로 SQL 쿼리를 생성하고 IDbCommand.ExecuteScalar()를 통해 실행하는 C# 코드가 있습니다. 이것은 잘 작동합니다. DB에서 내 쿼리와 정확히 일치하는 결과가 하나 있는데 그 결과가 항상 반환됩니다.IDbCommand.ExecuteScalar()가 성공하면 IDbCommand.ExecuteReader()가 실패 할 수있는 이유는 무엇입니까?

하지만 최근에는 DB에서 여러 일치를 지원하는 리팩터링의 첫 번째 단계로 ExecuteReader()에 대한 호출을 ExecuteScalar()로 대체했습니다. 설정 및 DB 액세스의 다른 모든 항목은 동일합니다. 그러나 반환 된 IDataReader에는 데이터가 포함되어 있지 않으며 데이터를 가져올 때마다 InvalidOperationExceptions가 throw됩니다.

데이터가 아직 남아 있습니다. ExecuteScalar()로 다시 전환하면 모든 것이 올바르게 작동합니다. 이것이 어떻게 가능한지?

답변

1

에있는 Read() 메서드는 ExecuteReader()에 액세스하기 전에 호출해야합니다. Read()을 호출하면 리더가 결과 집합의 첫 번째 행 (경우에 따라서 만)로 이동합니다. IDataReader에 액세스하기 전에 Read()으로 전화하지 않으면 데이터에 액세스하려고 시도 할 때 InvalidOperationException이 표시됩니다.

+0

Read() 대신 NextResult()를 사용하고있었습니다. 오케이. –

0

동일한 연결에서 여러 IDataReader를 열어 놓는 것과 관련이 있습니까?

당신은 늘 당신이

(A '를 사용하여'블록을 사용하여 예) 반드시 동일한 연결에서 이전의 모든 DataReaders에이 닫혀을 만들 필요) ExecuteScalar는()와 그 문제를 얻을 수 있지만, 한 번가 ExecuteReader를 (사용하기 시작하기 때문에

InvalidOperationException과 함께 표시되는 오류 메시지는 무엇입니까?

관련 문제