在VC中利用ADO调用oracle库的存储过程,存储过程如果耗时很长,想终止这个调用;
请教高手,这时候该怎么处理??自己弄了个小程序在测试,利用了CommandTimeOut、ConnectionTimeout属性没效果;也尝试过计时器timer,同样无效!调用的代码:
                  pCommand->ActiveConnection=m_pConnection;//连接对象
pCommand->CommandText=storeproc;
pCommand->CommandType=adCmdStoredProc;//设定CommandType属性为存储过程类型
pCommand->Parameters->Refresh();
pRecordset.CreateInstance(__uuidof(Recordset));
SetTimer(316,10000,NULL);
pRecordset=pCommand->Execute(NULL,NULL,adCmdStoredProc);

解决方案 »

  1.   

    ConnectionTimeOut用来设置连接的超时时间
      

  2.   

    用connectiontimeout的时候 注意使用顺序问题 
    先设置 connectiontimeout=10
    再打开对象,否则无效
      

  3.   

     顺序如此,应该没问题         
                            m_pConnection->ConnectionString="File Name=LinkDatabase.udl";
    m_pConnection->ConnectionTimeout=10;//等待连接的时间为10s
    m_pConnection->CommandTimeout=10; hr=m_pConnection->Open("","","",adConnectUnspecified);
    if(FAILED(hr))
    {
    AfxMessageBox("打开数据库失败!");
    return false;
    }
      

  4.   


    cmd->CommandTimeout    = 5;
    cmd->ActiveConnection = m_pConnection;
    cmd->CommandText = (_bstr_t)strProName;                
    cmd->CommandType = adCmdStoredProc
    cmd->Execute(NULL, NULL, adCmdStoredProc);  
      

  5.   

    不行啊,刚测试了下!CommandTimeout不起效果!
      

  6.   

    你用CommandTimeOut 的代码是什么样子的?
    是每次执行SQL前都重连 还是一直连着的?
      

  7.   

    这样的!是调用存储过程,不是执行SQL,也只是调用一次;
    pCommand->CommandTimeout=10;
    pCommand->ActiveConnection=m_pConnection;//连接对象
    pCommand->CommandText=storeproc;
    pCommand->CommandType=adCmdStoredProc;//设定CommandType属性为存储过程类型
    pCommand->Parameters->Refresh();
    pRecordset.CreateInstance(__uuidof(Recordset));
    SetTimer(316,2000,NULL);
    pRecordset=pCommand->Execute(NULL,NULL,adCmdStoredProc);
      

  8.   

    注意顺序//Define a command object for a stored procedure.     TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",NULL);    TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));    pCmdByRoyalty->ActiveConnection = pConnection;
        pCmdByRoyalty->CommandText = "byRoyalty";
        pCmdByRoyalty->CommandType = adCmdStoredProc;
        pCmdByRoyalty->CommandTimeout = 15;    //Define stored procedure's input parameter. 
        printf("Enter Royalty :  ");
        scanf("%d",&intRoyalty);    //Assign Integer value 
        vtroyal.vt = VT_I2;
        vtroyal.iVal  = intRoyalty;    TESTHR(pPrmByRoyalty.CreateInstance(__uuidof(Parameter)));
        pPrmByRoyalty->Type = adInteger;
        pPrmByRoyalty->Size = 3;
        pPrmByRoyalty->Direction = adParamInput;
        pPrmByRoyalty->Value = vtroyal;
        pCmdByRoyalty->Parameters->Append(pPrmByRoyalty);    //Create a recordset by executing a command. 
        pRstByRoyalty = pCmdByRoyalty->Execute(NULL,NULL,adCmdStoredProc);
      

  9.   

            _CommandPtr pCommand;
    pCommand.CreateInstance(__uuidof(Command));
    _bstr_t storeproc("SGPM.PKG_CC_CTI.P_GS_TEST2");//存储过程名 _RecordsetPtr pRecordset;
    try
    {
    double fOutCode=0;
    pCommand->ActiveConnection=m_pConnection;//连接对象
    pCommand->CommandText=storeproc;
    pCommand->CommandType=adCmdStoredProc;//设定为存储过程类型
    pCommand->CommandTimeout=10; pCommand->Parameters->Refresh();
    // pRecordset.CreateInstance(__uuidof(Recordset));
    SetTimer(316,15000,NULL);
    // pRecordset=pCommand->Execute(NULL,NULL,adCmdStoredProc);
    pCommand->Execute(NULL,NULL,adCmdStoredProc);已经改为这个顺序,还是不行,还是卡住在执行存储过程那;另外:ontimer的处理是:
    switch(nIDEvent)
    {
    case 316:
    m_pConnection->Close();
    m_pConnection.Release();
    AfxMessageBox("执行存储过程失败!");
    KillTimer(316);
    OnInitDialog();
    break;
    也不行!存储过程是个死循环:     
     i := 1;
    while i < 10000 loop
      i := i;
    end loop;
    特意测试为之的!求帮忙啊!!谢谢!