2015-07-10 129 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); 那么你就可以发现测试的类型。