OracleDataReader 抛出异常

Posted

技术标签:

【中文标题】OracleDataReader 抛出异常【英文标题】:OracleDataReader throws exception 【发布时间】:2011-01-07 19:53:43 【问题描述】:

在我当前的应用程序中,我需要执行 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();,我也会得到相同的异常

【问题讨论】:

【参考方案1】:

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)
    
        ...
    

【讨论】:

但是当我通过值将 reader 传递给 GetCount 时,它不会复制,所以我原来的 reader 保持不变? @xbonez 阅读器是引用类型意味着您发送的是引用的副本,而不是阅读器的副本。因此,您指向的是同一个读者 这可能是一个糟糕的解决方法,但是在将 reader 传递给 GetCount 之后,如果我将其复制到另一个 Datareader 变量并使用它来获取计数,它会起作用吗? 试过这样做。我仍然遇到同样的错误。我会尝试使用数据集方法。 您的解决方法仍然不起作用,因为 DataReader 类型实际上并不包含数据,它只是为您提供了一种从查询填充的缓冲区中获取数据的方法,否则您不会不需要对每条记录执行 read(),您只需引用它在数据集中的位置。【参考方案2】:

由于您使用的是阅读器,因此您已到达终点,需要重新设置才能回到起点。

看起来你并不真正关心计数是多少,只是它有行。所以你可以只使用 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

【讨论】:

这将获得列数,而不是行数。

以上是关于OracleDataReader 抛出异常的主要内容,如果未能解决你的问题,请参考以下文章

Java 异常 重写方法时抛出异常

Java:抛出异常后如何终止执行后面的代码?

JAVA如何抛出异常

java中异常抛出后代码还会继续执行吗

finally中流关闭失败需要抛出异常吗

java 中提示抛出异常