使用ADO访问ORACLE数据库程序,程序只查询数据,开始程序运行正常,但运行一段时间(半小时)左右,会出现错误对话框:
对话框标题:Microsot Visual C++ Runtime Libarary 错误:
Runtime Error!
Program: C:\.....
This application has requested the runtime to terminate it in an unusual way. please contact the application support team for more information.程序每5秒钟查询一次数据!请大侠帮忙!!谢谢~~~~

解决方案 »

  1.   

    ado查数据库要小心判断,你是不是取到空字段没判断或者取了不存在的字段
      

  2.   

    所有的ADO数据库操作都加try...catch(_com_error& e){AfxMessageBox(e.Description();}
      

  3.   

    可以用CStringArray实现类似CString sArray[2][10]的数组吗?
      

  4.   

    用debug模式查看callstack来断定其原因所在。
      

  5.   

    1. 连接数据库
    BOOL C***Dlg::ConnectDatabase()
    {
    HRESULT hr; _bstr_t user("");
    _bstr_t pwd("");
    try
    {
    hr = m_pConnection.CreateInstance(__uuidof(Connection)); // 初始化Connection

    if(SUCCEEDED(hr))
    {
            hr = m_pConnection->Open((_bstr_t)m_strSource, user, pwd, adModeUnknown/*adAsyncConnect*/);
    } if(SUCCEEDED(hr))
    {
    hr = m_pRecordset.CreateInstance(__uuidof(Recordset)); // 初始化Recordset
    } if(SUCCEEDED(hr))
    {
    m_fConnected = TRUE;
    }
    else 
    {
    m_fConnected = FALSE;
    return FALSE;
    }
    }
    catch (_com_error &e)
    {
    GenerateError(e.Error(), e.Description());

    m_fConnected = FALSE; return FALSE;
    }
    if(!m_fConnected) 
    {
    MessageBox("ADO数据源初始化失败!");
    return FALSE;
    } return (SUCCEEDED(hr));
    }2.打开表
    BOOL C***Dlg::OpenCurRecordset(CString strQuery)
    {
    // 有效性检验
    if(m_fConnected==FALSE) 
    {
    if(!ConnectDatabase())
    {
    return FALSE;
    }
    } if(strQuery.IsEmpty()) 
    return FALSE; HRESULT hr; try
    {
    hr = m_pRecordset.CreateInstance(__uuidof(Recordset)); // 初始化Recordset指针

    if(SUCCEEDED(hr))
    hr = m_pRecordset->Open(_variant_t(strQuery), _variant_t((IDispatch *)m_pConnection,true), adOpenStatic, adLockOptimistic, adCmdText); if(SUCCEEDED(hr))
    {
    m_fRecordSet = TRUE;
    }
    else
    {
    m_fRecordSet = FALSE;
    return FALSE;
    }
    }
    catch (_com_error &e)
    {
    m_fConnected = FALSE;
    GenerateError(e.Error(), e.Description());
    m_pConnection -> Close();
    m_pConnection = NULL;

    return FALSE;
    } m_fRecordSet = SUCCEEDED(hr);
    return (SUCCEEDED(hr));
    }3.查询数据保存到数组
    BOOL C***Dlg::QueryData(CStringArray * arrQueryData, int nRow)
    {
    CStringArray saFieldsValue;  //保存字段值
    saFieldsValue.SetSize(3); // 打开记录集
    if(m_fRecordSet == FALSE)
    {
    if(!OpenCurRecordset(m_strQuery))
    {
    MessageBox(_T("打开记录失败!\n"), "提示", MB_OK|MB_SYSTEMMODAL|MB_ICONINFORMATION);
    return FALSE;
    }
    }

    if (!m_pRecordset->adoBOF)
    {
    m_pRecordset->MoveFirst();
    }

    int nIndex=0;
    while (!m_pRecordset->adoEOF)
    {
    saFieldsValue.SetAtGrow(0, VariantToCtring(m_pRecordset->GetFields()->GetItem("PRESC_NO")->GetValue())); // PRESC_NO 开药编号
    saFieldsValue.SetAtGrow(1, VariantToCtring(m_pRecordset->GetFields()->GetItem("NAME")->GetValue())); // NAME 姓名
    saFieldsValue.SetAtGrow(2, VariantToCtring(m_pRecordset->GetFields()->GetItem("WIN_NO_CLEAR")->GetValue())); // WIN_NO_CLEAR 窗口号 // 保存数据到数组
    for(int n = 0; n < nRow; n++)
    {
    arrQueryData[n].SetAtGrow(nIndex, saFieldsValue.GetAt(n));
    } // 保存窗口号
    m_nWinNumber = atoi(saFieldsValue.GetAt(2));
    m_pRecordset->MoveNext(); // 下一个记录
    nIndex ++;                 // 索引加1
    } // 关闭记录集
    if(m_pRecordset != NULL)
    {
    m_pRecordset->Close();
    m_pRecordset = NULL;
    m_fRecordSet = FALSE;
    } saFieldsValue.RemoveAll();
    saFieldsValue.FreeExtra(); return TRUE;
    }
    4.比较两次查询的数据,保存新增数据
    BOOL C***Dlg::CompareQueryData()
    {
    BOOL bNewFlag;
    bNewFlag = FALSE;

    GetDlgItemText(IDC_EDIT_SQLQUERY, m_strQuery);

    if(m_strQuery.IsEmpty())
    {
    return FALSE;
    }

    CStringArray arrTempData[2];
    int nCount = GetCount(); // 获得记录数
    arrTempData->SetSize(nCount,10); // 设置数组大小 QueryData(arrTempData, 2); // 查询新数据 CString strName1, strName2, strNO1, strNO2; 
    // 与上一次数据进行比较
    for(int i = 0; i < arrTempData->GetSize(); i ++)
    {
    strNO2.Format("%s", arrTempData[0].GetAt(i));
    strName2.Format("%s", arrTempData[1].GetAt(i));

    int num = 0;
    for(int j = 0; j < m_arrQueryData->GetSize(); j ++)
    {
    strNO1.Format("%s", m_arrQueryData[0].GetAt(j));
    strName1.Format("%s", m_arrQueryData[1].GetAt(j));

    if(strName1 == strName2 && strNO1 == strNO2)
    {
    num += 1;
    break;
    }
    }
    if(num == 0)
    {
    m_vaNewName.push_back(strName2); // vector 
    bNewFlag = TRUE;
    }
    num = 0;
    }

    if(bNewFlag || arrTempData->GetSize() != m_arrQueryData->GetSize())
    { // 如果有更新,将新记录覆盖上次查询的记录
    m_arrQueryData[0].Copy(arrTempData[0]);
    m_arrQueryData[1].Copy(arrTempData[1]);
    } arrTempData->RemoveAll();
    arrTempData->FreeExtra(); return bNewFlag;
    }首先,启动时候将查询一次数据,将符合条件的数据保存在m_arrQueryData中,然后用定时器,每隔5秒再查询一次,与上一次数据比较
      

  6.   

    程序运行半小时左右会弹出Runtime error错误,关闭!
      

  7.   

    在 BOOL C***Dlg::CompareQueryData()函数里打断点,跟踪出错原因,应该是指针指向错误。