我使用ado连接到oracle数据库,当记录很多时就会死机(上十万条记录)。请高手指点可能出错的原因,还有解决方法。非常的急,谢谢指点。

解决方案 »

  1.   

    不会吧,只连接?没有select吗,应该不会呀。
    是不是有死循环?
    跟踪一下
      

  2.   

    当然是有select,大概创建了8个记录集,其中的几个记录集在反复的开关(当然我在每打开一次之前都会判断是否打开,如果打开就先关闭)。
    我要查询的记录有很多,大概60万条。
    出现这样的问题是否是连接超时造成的?如果是用什么办法来解决?请高手们指点!
      

  3.   

    ljq76(赶路人) 
      不会,应当是记录集的问题!请问有什么问题?麻烦讲得详细点
      
     
      

  4.   

    1 server 上的内存小,在工作时内存资源耗尽,产生错误的返回结果,造成死机
    2 返回结果太多,客护端资源耗尽或过多的使用虚拟内存,产生内存页错误,造成死机增加物理内存分
      

  5.   

    to  xuefl66(xuefl66) :
    请说详细点,谢谢。
      

  6.   

    是增加机器的内存条,还是增加数据库的缓存?
    如何增加oracle的缓存?
      

  7.   

    觉得应该是该存储过程搜索到了太多的记录,而程序中处理不当,出现了死机,也有可能是存储过程编写不当,出现了死循环应该是程序一方出现问题,想想oracle是个大型数据库,几十万条记录根本不算多,不会是这方面有错
      

  8.   

    我在客户端用sql puls执行相同的sql语句大约需要一分多钟。现在我编了一个测试用的程序,用_ptrConnection的Execute来执行,这个语句就无法执行成功。这是为什么?提示说“用户当前的操作已取消”。
      

  9.   

    up up up up up up
      

  10.   

    up up up up up up
      

  11.   

    我想用ado的分页功能来避免一次取出太多的记录数,应该能够有用。
      

  12.   

    to imzxr(雨点) :
       能说得详细点吗?
      

  13.   

    我出问题的语句是:
    strCmdText1   = "SELECT COUNT(*) FROM v_tele_qfb WHERE iDhlb = 1";
    if (ptrRecordset->State == ADODB::adStateOpen)
    {
    ptrRecordset->Close();
    }
    ptrRecordset->Open((LPCTSTR)strCmdText1, _variant_t((IDispatch* )ptrConnection, true), adOpenStatic, adLockReadOnly, adCmdText);
    m_nTotal_u1 = ptrRecordset->Fields->GetItem("count(*)")->GetValue();
    执行这个语句就死机,
        catch(_com_error &e)
        {
            // Notify the user of errors if any.
            char strErr[255];
            _bstr_t bstrSource(e.Source());
            _bstr_t bstrDescription(e.Description());
            sprintf(strErr,"Source3 : %s \n Description : %s\n",
                    (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
            #ifdef _DEBUG
    AfxMessageBox(strErr,MB_ICONEXCLAMATION);
            #endif //_DEBUG        return -1;
        }
    抛出的错误为:ole db不支持所需的属性
      

  14.   

    我看错了
    抛出的错误为:odbc不支持所需的属性
      

  15.   

    strCmdText1   = "SELECT COUNT(*) AS ct FROM v_tele_qfb WHERE iDhlb = 1";//
    if (ptrRecordset->State == ADODB::adStateOpen)
    {
    ptrRecordset->Close();
    }
    ptrRecordset->Open((LPCTSTR)strCmdText1, _variant_t((IDispatch* )ptrConnection, true), adOpenStatic, adLockReadOnly, adCmdText);
    m_nTotal_u1 = ptrRecordset->Fields->GetItem("ct")->GetValue();//
      

  16.   

    首先你要获得记录数,不要使用count(*),这样会很慢,你可以使用count(字段A)来获得记录数;其次,我好像没有查到recordset的fields有getitem的方法,请把你的变量定义贴出来。
      

  17.   

    是ado的_RecordsetPtr对象.
    我的语句中v_tele_qfb是一个视图,我把视图改为表后就没有问题了,不知是什么原因?
    还有我在程序中没法使用Move语句,例如:
          ptrRecordset_u4_z->Move(25);
    但是改为语句:
          ptrRecordset_u4_z->MoveFirst();
          for (int i4 = 1; i4 <= m_nCount_u4_z; i4++)
          {
    ptrRecordset_u4_z->MoveNext();
          }
    就可以了,这是不是因为数据库本身有问题?