【问题标题】:InvalidOperationException when try to ExecuteReader() with Oracle Data Access ODP.NET 11.2尝试使用 Oracle 数据访问 ODP.NET 11.2 执行 ExecuteReader() 时出现 InvalidOperationException
【发布时间】:2011-07-19 19:48:01
【问题描述】:

这是我第一次与 Oracle 合作,因为我们都讨厌在您使用特定模型的情况下使用外国的东西几年,尽管这是我们的工作,我们必须做到。

现在我已经安装了 Oracle 11 g 并复制并引用了 Oracle.DataAccess.dll 创建了一个打开连接并尝试从服务器上创建的视图中检索一些对象的方法。

方法:

public BindingList<HeaderReceiver> GetHeaderReceivers()
{
    try
    {
        using (OracleConnection db = new OracleConnection(BaseDataAccess.ConnString))
        {
            string cmdText = "select * from p_customer t";
            BindingList<HeaderReceiver> headerReceivers = new BindingList<HeaderReceiver>();

            OracleCommand cmd = new OracleCommand(cmdText) { CommandType = CommandType.Text };
            db.Open();

            OracleDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); <--- Error Occurs HERE!!!

            while (reader.Read())
                headerReceivers.Add(HeaderReceiver.GetInstance(reader));

            CustBranchRepository rep = new CustBranchRepository();
            headerReceivers.ForEach(p => p.DetailsBranch = rep.GetDetailReceivers(p.Id));

            reader.Close();
            db.Close();
            return headerReceivers;
        }
    }
    catch (Exception ex)
    {
        ExporterLogger.Log(ex);
        return null;
    }
}

现在当 ExecuteReader() 提交时,我得到了这个 InvalidOperationException。

Operation is not valid due to the current state of the object.

堆栈跟踪:

   at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior)
   at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(CommandBehavior behavior)
   at Exporter.Boss.DataAccess.CustomerRepository.GetHeaderReceivers() in ...Exporter\Exporter.Boss.DataAccess\CustomerRepository.cs:line 25

任何想法和帮助...

谢谢!

【问题讨论】:

    标签: c#-4.0 oracle11g odp.net data-access


    【解决方案1】:

    您似乎缺少命令对象上的连接...

    db.Open();
    OracleCommand cmd = new OracleCommand(cmdText) { CommandType = CommandType.Text };
    cmd.Connection = db;
    

    【讨论】:

    • 找到这篇文章。在我的 Command 对象上调用 ExecuteDataReader() 时,我确实遇到了这个错误。原来我确实在 Command 对象上设置了连接,但我在调用 ExecuteDataReader() 之后这样做了。当我切换两条线时,它工作得很好。所以,这应该被标记为 imo 的正确答案。
    • 如上OracleCommand初始化后立即设置连接,它会工作。
    猜你喜欢
    • 2015-02-14
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    相关资源
    最近更新 更多