2008-09-09 10 views
4

IDataReader.Read()は少なくとも1回は真実です(これについて私が間違っていると分かります)。それで、try/catchでラップするだけでレコードがないかどうかをどうやって伝えますか?IDataReaderが空であるかどうかを検出する最良の方法は何ですか?

+0

ベンは正しいです。 IDataReaderが空の行セットから読み取っている場合、Read()の最初の呼び出しはfalseを返します(使用している特定の実装が正しく書かれていると仮定して)。 –

答えて

13
if(dr.Read()) 
{ 
    //do stuff 
} 
else 
{ 
//it's empty 
} 

通常あなたはこのかかわらず、やる:

while(dr.Read()) 
{ 
} 
+1

これは私が試みたものですが、少なくとも1回は常に条件が真であると思われますが、リーダーから値を抽出しようとするとエラーが発生します。 –

+1

これに注意してください、 'Read()' [読者は次の行に進みます](https://msdn.microsoft.com/en-us/library/system.data.idatareader.read(v = vs.110) ).aspx)。したがって、**ただ**データが含まれているかどうかを確認しないでください – Liam

4

インターフェイスを使用したい場合は、[はい、その後、偽まで読み取りテストするための唯一の方法です。汎用のIDataReader実装をお探しの場合は、DbDataReaderを試してHasRowsプロパティを使用してください。

+2

DbDataReaderは抽象クラスです – aku

+0

@aku:はい、その点です。 IDataReaderは、(通常)IDataReaderを実装するDbDataReaderから派生するデータ型で実装されるインターフェイスです。 –

+0

実際には、 'IDataReader' _object_には決して' Read() 'を呼び出さないでしょう。なぜなら、そのようなことはないからです。そして実際の実装では、 'DbdataReader'というオブジェクトを取得します。したがって、戻り値の型として 'IDataReader'に戻ってクラスをダウングレードしなければ、それを呼び出すことができます。そしてもしそれがダウングレードされても、それはチェックする価値があります: 'if(readerはDbDataReader)return((DbDataReader)reader).HasRows' – Nyerguds

2

あなただけのそれは純粋な悪だが、それは(通常は)働くSystem.Data.Common.DbDataReader

using (System.Data.IDataReader IReader = ICommand.ExecuteReader()) 
{ 
    if (((System.Data.Common.DbDataReader)IReader).HasRows) 
    { 
     //do stuff 
    } 
} // End Using IReader 

System.Data.IDataReaderをキャストすることができます;)

(、IDataReaderのインスタンスがカスタムADO.NETプロバイダによって実装されると仮定するとあなたのカスタムの愚かなクラスではなく、DbDataReader [IDataReader]から派生する代わりにIDataReaderを実装するだけです)。

2

はちょうどこの問題に出くわし、これを思い付いた...

bool isBeforeEoF; 

do 
{ 
    isBeforeEoF = reader.Read(); 

    if (isBeforeEoF) 
    { 
     yield return new Foo() 
     { 
      StreamID = (Guid)reader["ID"], 
      FileType = (string)reader["Type"], 
      Name = (string)reader["Name"], 
      RelativePath = (string)reader["RelativePath"] 
     };   
    } 

} while (isBeforeEoF); 
+0

ありがとう。これが助けになりました! –

関連する問題