使用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秒钟查询一次数据!请大侠帮忙!!谢谢~~~~
对话框标题: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秒钟查询一次数据!请大侠帮忙!!谢谢~~~~
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秒再查询一次,与上一次数据比较