2011-01-07 51 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 

編輯: 試試這個

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 2011-01-07 20:12:09

+1

@xbonez閱讀器是一個參考類型,意味着你正在發送一個參考值的副本而不是閱讀器的副本。因此你指向同一個閱讀器 – 2011-01-07 20:14:57

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