ORA-01000:最大打开游标超出错误

时间:2017-03-13 12:06:22

标签: c# oracle ado.net

我有以下代码:

 using (System.Data.OracleClient.OracleConnection dataConn = new System.Data.OracleClient.OracleConnection(_connectionString))
            {
                using (System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand())
                {
                    cmd.Connection = dataConn;
                    cmd.CommandText = "DELETE FROM Employees WHERE LOCATIONID=  :LOCATIONID";
                    cmd.Parameters.AddWithValue(":LOCATIONID", locationId);
                    dataConn.Open();
                    retVal += cmd.ExecuteNonQuery();
                    dataConn.Close();
                }
                using (System.Data.OracleClient.OracleCommand cmd = new System.Data.OracleClient.OracleCommand())
                {
                    cmd.Connection = dataConn;
                    cmd.CommandText = string.Format("DELETE FROM Locations WHERE LocationId = :LOCATIONID";
                    cmd.Parameters.AddWithValue(":LOCATIONID", locationId);
                    dataConn.Open();
                    retVal += cmd.ExecuteNonQuery();
                    dataConn.Close();
                }
            }

仅供参考,

  • 我在50次迭代循环中调用上面的块。
  • 在每次迭代中,我传递一个新的locationid。 - 每次迭代的第一个查询可能会在avg上删除500条记录,因为一个位置被分配给500多名员工。

根据this链接:,我认为我正在做的事情,任何人都可以指出为什么我仍然得到 ORA-01000:最大开放游标超出错误? 任何帮助将受到高度赞赏。 感谢。

1 个答案:

答案 0 :(得分:0)

根据帖子(ORA-01000: maximum open cursors exceeded in asp.net)中链接中的接受答案,当您调用dataConn.Close()时,连接并未真正关闭,而是在连接池中保持打开状态。这是一种隐藏的优化,可以更快地打开其他连接,但是当您超出某些限制时,可能会导致Oracle出现问题。我建议您研究限制连接池大小的方法 - 这取决于托管代码的内容(IIS?还有其他什么?)。

您还可以将SQL更改为“DELETE FROM TABLE WHERE键IS IN(...值列表...)”。这将消除打开50个逻辑连接的需要(谁知道有多少物理连接 - 可能很多)。

或者在dataConn.Open中进行循环... dataConn.Close - 只需对所有cmd使用相同的开放连接。

编辑:根据您使用的数据提供程序,连接池的大小可以从连接字符串中控制。有关示例,请参阅https://msdn.microsoft.com/en-us/library/ms254502(v=vs.110).aspx