又是内存问题,各位高手救命啊!高分相谢!
Wanix 2010-05-01 02:15:16 调用下面的操作数据库函数时,如果当时数据库断开了,会走异常分支A,在异常分支中程序正常,ShowTip和WriteLog运行正常,当函数return返回时报Unhandled exception in TEST.exe (MFC42D.DLL): 0xC0000005: Access Violation。
经过调试跟踪,发现在C:\Program Files\Microsoft Visual Studio\VC98\MFC\Include\AFX.INL中的
_AFX_INLINE CStringData* CString::GetData() const
{ ASSERT(m_pchData != NULL); return ((CStringData*)m_pchData)-1; }
里报的,已经搞了好几个晚上了,哪位高人给指点一下呀?!??!
bool CTestDlg::InsertCurrProperty(CString strA, CString strB,
CString strC, CString strD, CString strE,
CString strF, CString strG,
CString strH, CString &strI)
{
char szSql[256];
char aczA[64];
char aczB[32];
char aczC[16];
char aczD[16];
char aczF[32];
char aczG[32];
char aczH[64];
char aczSystemTime[32];
SYSTEMTIME stSysTime;
bool bRet = true;
memset(szSql, 0, sizeof(szSql));
memset(aczA, 0, sizeof(aczA));
memset(aczB, 0, sizeof(aczB));
memset(aczC, 0, sizeof(aczC));
memset(aczD, 0, sizeof(aczD));
memset(aczF, 0, sizeof(aczF));
memset(aczG, 0, sizeof(aczG));
memset(aczH, 0, sizeof(aczH));
memset(aczSystemTime, 0, sizeof(aczSystemTime));
strcpy(aczA, strA);
strcpy(aczB, strB);
strcpy(aczC, strC);
strcpy(aczD, strD);
strcpy(aczF, strF);
strcpy(aczG, strG);
strcpy(aczH, strH);
sprintf( szSql, "SELECT * FROM TEST WHERE A='%s'", strA );
CTime time = CTime::GetCurrentTime();
time.GetAsSystemTime(stSysTime);
sprintf(aczSystemTime, "%d-%02d-%02d %02d:%02d:%02d.%03d",
stSysTime.wYear, stSysTime.wMonth, stSysTime.wDay,
stSysTime.wHour, stSysTime.wMinute, stSysTime.wSecond,
stSysTime.wMilliseconds);
try
{
//互斥访问
WaitForSingleObject( gPublicEvent, INFINITE );
// 开始事务
//m_pConnection->BeginTrans();
//打开数据表
HRESULT hr = m_pRecordset->Open( szSql,
m_pConnection.GetInterfacePtr(), // Get Link Libary IDispatch Pointer
adOpenDynamic,
adLockOptimistic,
adCmdText
);
if (!SUCCEEDED(hr))
{
//事务回退
//m_pConnection->RollbackTrans();
// 置为已通知
SetEvent(gPublicEvent);
return false;
}
int nCount = m_pRecordset->GetRecordCount();
if (nCount > 1)
{
// 置为已通知
SetEvent(gPublicEvent);
return false;
}
_variant_t var, varget;
//找到
if ( !m_pRecordset->adoEOF )
{
/*先获取上次的值*/
varget = m_pRecordset->GetCollect("F");
strI = (LPCSTR)_bstr_t(varget);
/*修改记录*/
//m_pRecordset->PutCollect("A", _variant_t(strA));
m_pRecordset->PutCollect("RouterID", _variant_t(strB));
var.iVal = atoi(strC);
m_pRecordset->PutCollect("C", var.iVal);
var.iVal = 0;
m_pRecordset->PutCollect("E", var.iVal);
var.iVal = atoi(strD);
m_pRecordset->PutCollect("D", var.iVal);
m_pRecordset->PutCollect("F", _variant_t(strF));
m_pRecordset->PutCollect("G", _variant_t(strG));
m_pRecordset->PutCollect("SystemTime", _variant_t(aczSystemTime));
m_pRecordset->PutCollect("FirstH", _variant_t(strH));
/*更新*/
m_pRecordset->Update();
}
//关闭记录集
m_pRecordset->Close();
// 置为已通知
SetEvent(gPublicEvent);
}
catch(_com_error *e)
{
bRet = false;
//关闭记录集
if (m_pRecordset->State)
{
m_pRecordset->Close();
}
// 置为已通知
SetEvent(gPublicEvent);
ShowTips(TIP_FATAL, "访问数据库表TEST出现异常, 请查看日志了解详情!");
WriteLog(LEV_ERROR, "错误编号=[%08lx], 错误信息=[%s], 错误源[%s], 错误描述[%s]",
e->Error(),
e->ErrorMessage(),
(LPCSTR)e->Source(),
(LPCSTR)e->Description());
}
catch(_com_error e) -------------------------------------------异常分支A
{
bRet = false;
//关闭记录集
if (m_pRecordset->State && e.Error() != adoConnectFail)
{
m_pRecordset->Close();
}
// 置为已通知
SetEvent(gPublicEvent);
ShowTips(TIP_FATAL, "访问数据库表TEST出现异常, 请查看日志了解详情!");
WriteLog(LEV_FATAL, "错误编号=[%08lx], 错误信息=[%s], 错误源[%s], 错误描述[%s]",
e.Error(),
e.ErrorMessage(),
(LPCSTR)e.Source(),
(LPCSTR)e.Description());
}
catch (...)
{
bRet = false;
if (m_pRecordset->State)
{
m_pRecordset->Close();
}
// 置为已通知
SetEvent(gPublicEvent);
ShowTips(TIP_FATAL, "访问数据库表TEST出现异常, 请查看日志了解详情!");
}
return bRet;
}