我有以下代码:
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();
}
}
仅供参考,
根据this链接:,我认为我正在做的事情,任何人都可以指出为什么我仍然得到 ORA-01000:最大开放游标超出错误? 任何帮助将受到高度赞赏。 感谢。
答案 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。