2011-01-07 50 views
0

私の現在のアプリケーションでは、SQL問合せを実行し、処理を続行する前に返される結果の数を取得する必要があります。これは、以下の私のコードです:OracleDataReaderが例外をスローします

if (GetCount(reader) == 1) 
       { 
        reader.Read(); 
        Console.WriteLine(reader["field1"]); 
        Console.WriteLine(reader["field2"]); 
       } 

そして、これは、それがあれば、コードブロックに入ったときに、結果のカウントを受け取った後GetCount()方法

public static int GetCount(OracleDataReader reader) 
     { 
      int count = 0; 

      while (reader.Read()) 
      { 
       count++; 
      } 

      return count; 
     } 

で、例外が述べて投げます:

[System.InvalidOperationException] = {"Operation is not valid due to the current state of the object."} 

ただし、カウントが得られない場合は正常に動作します。

私のGetCount関数はreader.Read()を持っているので、値を読み取る前に何らかの形でリーダーをリセットする必要があると思いますか?正直なところ、私は困惑しています。助言がありますか?

編集; 最初のコードブロックでは、私がコメントアウトしても同じ例外が発生しますreader.Read();

答えて

2

GetCount()の後、あなたはあなたのリーダーを繰り返しました。あなたは次のreader.Read()に電話する前に値を使って何かをする必要があります。基本的にはiterate through your reader twiceにしようとしていますが、できません。

DataSetを参照してGetCount()に渡して入力すると、メインコードブロックのDataSetが参照されます。しかし、DataSetに入れると、DataSetには十分な性質があるので、何も数える必要はありません。

例:

myDataset.Tables[0].Rows.Count 

EDIT: これは

OracleDataAdapter adapter = new OracleDataAdapter(yourSQLQuery,yourConnString); 
DataSet data = new DataSet(); 

adapter.Fill(data); 

if (data.Tables.Count != 0) 
{ 
    if (data.Tables[0].Rows.Count == 1) 
    { 
     ... 
    } 
} 
+0

私は値でGetCountのを読者に渡すとき、私の元読者がそのまま残るようにしかし、それは、コピーを作成しないのですか? – xbonez

+1

@xbonez読者が参照型であるということは、読者のコピーではなく値で参照のコピーを送ることを意味します。あなたは同じリーダーを指しています –

+0

恐ろしい回避策かもしれませんが、GetCountにリーダーを渡した後、別のDatareader変数にコピーしてカウントを取得すると使用できますか? – xbonez

1

あなたがリーダーを使用しているので、あなたが最後に到達してみて、それがに戻ってリセットする必要があります始まり。

カウントが何であるかを気にしないように見えます。行があるだけです。だからあなたはHasRowsプロパティを使うことができます。

if (reader.HasRows) 
{ 
    reader.Read(); 
    Console.WriteLine(reader["field1"]); 
    Console.WriteLine(reader["field2"]); 
} 

実際に行数が必要な場合、これは機能しませんが、この例では問題ありません。

http://msdn.microsoft.com/en-us/library/system.data.oracleclient.oracledatareader.aspx

+3

これは、行ではなく列の数を取得します。 –

+0

ああ、ちょっと、それはすぐそこに言う。 –

+0

は間違いに基づいて編集されました –

関連する問題