2014-02-21 3 views
2

Firebird ADO.NET Data Provider를 사용하고 있습니다. 사용중인 서비스에 독자를 전달하기 전에 행이 반환되었는지 여부를 확인하고 싶습니다. 다음 코드를 고려 : 내가 지금 배운 것은 그 FbDataReader.HasRows항상 반환 True입니다결과에 행이 있는지 확인하는 방법은 무엇입니까? (FbDataReader.HasRows는 항상 true를 반환합니다!)

FbCommand cmd = GetSomeCommandFromTheEther(); 
FbDataReader reader = cmd.ExecuteReader(); 

if (reader.HasRows) 
    DoSomethingWith(reader); 
else 
    TellTheUserWeGotNothing(); 

. 사실 the source code을 보면 FbDataReader.command.IsSelectCommand에 대한 래퍼 일뿐 아니라 쓸모 없을뿐만 아니라 속성 이름 "HasRows"가 완전히 잘못된 이름으로 표시됩니다.

어쨌든 주어진 레코드에 의 레코드 포인터가없는 행이 있는지 어떻게 알 수 있습니까?? 독자가 외부 서비스에 전달하려고합니다. 결과를 확인하기 위해 FbDataReader.Read()으로 전화하면 행을 사용하며 DoSomethingWith()은 첫 번째 행을 가져 오지 않습니다.

+0

http://tracker.firebirdsql.org/browse/DNET에서 버그를 신고 할 수 있습니까? –

+0

@MarkRotteveel [하나있다] (http://tracker.firebirdsql.org/browse/DNET-305), "Will not Fix"로 마감되었습니다. –

답변

6

Firebird 제한 사항을 발견했습니다. Firebird FAQ link 다음에 명시된 바와 같이 :

왜 항상 true 반환 FbDataReader.HasRows?

FbDataReader.HasRows 속성은 호환 에 대해서만 구현됩니다. Firebird는 쿼리가 데이터를 가져 오지 않고 행을 반환하는지 알기 위해 을 알 수 없으므로 항상 true를 반환합니다.

이미 Firebird Tracker에 언급되어 있습니다. 문제 DNET-305을 확인하십시오. 한편

는 .NET에서,이 MSDN link에 명시된 바와 같이, DbDataReader에서 상속 같은 문제가 OleDbDataReaderSqlDataReader 보인다.

FbDataReader은 그 (것)들과 동일한 종류에서 상속하기 때문에, MS가 문서에서 제안하는 workarounds의 한을 고려하고 싶을 수도 있습니다. 이것은 select count(*)을 먼저 수행하는 것입니다. 허락하신다면 그것은 시간이 많이 걸리고 시간과 자원을 낭비하지만 적어도 당신을 도울 수 있습니다.

+0

제안 및 링크에 감사드립니다. 나는 이미 동일한 쿼리를 두 번 실행하는 방법을 사용했다. 처음에는'Read()'의 결과를 확인하고, 참이면 되돌아 가서 다시 실행한다. 솔직히 나는 (비록 당신의 잘못이 아니다) 설명을 좋아하지 않는다. 서버가 알림을 제공하지 않더라도 왜 단순히'HasRows'에 대한 호출에서 첫 번째 행을 읽고 캐시하지 못하고 이후에'Read()'를 호출 할 때이 행을 생성 할 수 있습니다. 적어도, 피 호출자에게 거짓말하는 대신 NotSupportedException을 던져라. –

+0

나는 그것이 다르게 행해져 야한다는 것에 동의한다. 앞으로 Firebird ADO.NET 버전에서 변경 될 수 있기를 바랍니다. 죄송합니다 더 도움이되지 못했습니다. –

+0

문제 없습니다. 나는 그 다음 사람이이 대답을 먼저 찾도록 도울 수 있습니다 - 머리를 찢어서 (오류가없는) 코드를 디버깅하기 전에. 특히 다른 언급이없는 IntelliSense 설명서가없는 경우. :) –

관련 문제