OracleDataReader抛出异常

时间:2011-01-07 19:53:43

标签: c# sql oracle

在我目前的应用中,我需要执行SQL查询,并在继续之前获取返回结果的计数。这是我的代码:

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;
        }

在收到结果计数后,当它进入if代码块时,会抛出异常,说明:

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

然而,如果我没有得到计数,它运作正常。

我认为既然我的GetCount函数有reader.Read(),我需要在读取值之前以某种方式重置读者吗?老实说,我很难过。有什么建议吗?

编辑; 在第一个代码块中,即使我注释掉reader.Read();

,我也会得到相同的异常

2 个答案:

答案 0 :(得分: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)
    {
        ...
    }
}

答案 1 :(得分: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