2015-07-10 138 views
0

我被困在讀取oracle表中的行數。正如你在圖片上看到的,我得到正確的值(2.007.191),但無法在Int64中保護它。使用OracleDataReader獲取Count(*)的值

enter image description here

我已經嘗試過Int64 count2 = (Int64) command.ExecuteScalar();Int64 test2 = reader.GetInt64(0);,也都與Int32但總是得到錯誤

System.InvalidOperationException:操作無效由於對象的當前狀態。在Oracle.DataAccess.Client.OracleDataReader.GetInt64(Int32 i)

我在做什麼錯?由於

+0

您能否將相關代碼顯示爲文本? –

+0

什麼是實際類型? 'command.ExecuteScalar()的GetType()';看起來你必須做'(int)command.ExecuteScalar()' –

回答

0

的數據閱讀器需要您Read第一,你實際上是在試圖讓一個值之前。

所以,你應該開始:

long test2; 
if (reader.Read()) 
{ 
    // read the first and only line 
    test2 = reader.GetInt64(0); 
} 
else 
{ 
    test2 = 0; 
} 

通常與數據讀取器,你所期望的多行,你可以使用一個while insteaf的if的。

併爲您的通話ExecuteScalar,你可能需要Convert.ToInt64

long count2 = Convert.ToInt64(command.ExecuteScalar()); 
+0

'long count2 = Convert.ToInt64(command.ExecuteScalar());'works but'test2 = reader.GetInt64(0);'給我錯誤'System.InvalidCastException:指定的轉換無效。在Oracle.DataAccess.Client.OracleDataReader.GetInt64(Int32 i)'。謝謝! –

2

您應該檢查讀者有閱讀價值之前:

if(reader.Read()) 
{ 
    long test2 = Convert.ToInt64(reader[0]); 
} 
+1

'if'在這種情況下比'while'更具可讀性*。 –

+0

@DmitryBychenko你是對的只有一個值會在那裏..謝謝 – Sachu

+0

@Sachu完美工作,謝謝 –

0

我發現有用的是var test = reader.GetValue(0); 那麼你就可以發現測試的類型。