【问题标题】:How can I avoid "Open cursor limit exceeded" error for this code?如何避免此代码出现“超出打开游标限制”错误?
【发布时间】:2025-12-27 21:45:15
【问题描述】:
foreach (string num in ld2.Keys)
{
  double state;
  int i;

  for (i = 0; i < states.Count; i++)
  {
    cmd = mdb.getCommand("select value V " +
                         "  from TAB_CHART_DATA " + 
                         " where TIMESTAMP = (select max(TIMESTAMP) " +
                         "                      from TAB_CHART_DATA " + 
                         "                     where chart_type= " + chart_type + 
                         "                       and upper(upper(state)) = '" + states[i] + "' " +
                         "                       and CSIS_ID = " + CSISPID + 
                         "                       and baselinecode like '" + num + "'" +
                         "                   ) " +
                         "   and chart_type = " + chart_type + 
                         "   and upper(state) = '" + states[i] + "' " +
                         "   and CSIS_ID = " + CSISPID + 
                         "   and baselinecode like '" + num + "'"
                        );

    state = mdb.ExecSQLAndGetFirstInt(cmd);
  }

}

这个循环运行了 3000 多次。

【问题讨论】:

  • 请给我们看真实的代码。您是否可能每次都在循环中创建一个新语句而不是关闭它?
  • 无论ExecSQLAndGetFirstInt 在做什么,它都应该关闭它用来检索数据的阅读器。
  • @a_horse_with_no_name- 是的,它关闭了阅读器。
  • 关闭阅读器是否意味着关闭光标?
  • 您的代码对SQL Injection开放

标签: c# sql oracle ado.net plsql


【解决方案1】:

在一个查询中获取所有行并循环遍历代码中的结果集,而不是打开游标并终止数据库。

【讨论】:

  • 我想使用查询结果进行进一步的抓取。
  • @laksh - 请发布完整的代码并确切地解释您要做什么(编辑您的问题并添加详细信息)。
最近更新 更多