int CDyndb::OpenRec(CString sSQL)
{
_variant_t TheValue;
CDynRec *ptemprec = new CDynRec;
try
{
ptemprec->m_pRecordset->Open(_bstr_t(sSQL),m_pConnection.GetInterfacePtr(),
adOpenStatic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
delete e;
if(ptemprec != NULL)
delete ptemprec;
return 0;
}
catch(...)
{
int count = m_pConnection->Errors->GetCount ();
for(long i = 0; i < count; i ++)
{
m_pError = m_pConnection->Errors->GetItem (_variant_t(i));
AfxMessageBox ((char*)m_pError->Description);
}
if(ptemprec != NULL)
delete ptemprec;
return 0;
}
CDynRec* prst;
BOOL bExist;
POSITION pos;
for(long id = 1;;id++)
{
bExist = FALSE;
pos = m_recs.GetHeadPosition ();
while(pos != NULL)
{
prst = m_recs.GetNext (pos);
if(prst->m_id == id)
{
bExist = TRUE;
break;
}
} if(!bExist)
{
ptemprec->m_id = id;
break;
}
} m_recs.AddTail(ptemprec); return ptemprec->m_id;
}m_pConnection是一个已经连上数据库的_ConnectionPtr.
CDynRec构造析构函数如下:
CDynRec::CDynRec()
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
}CDynRec::~CDynRec()
{
m_pRecordset.Release();
}
类CDynRec 封装了_RecordsetPtr,每个由此函数返回的CDynRec 指针在使用完后会马上被delete,所以m_recs(Clist)的数据个数维持在5以下。
数据库是oracl8.1.7,使用系统数据源。该函数被调用大概4700多次后开始出错在ptemprec->m_pRecordset->Open(_bstr...)
错误描述是"ODBC driver does not support the requested properties."
请问高手,什么原因?分数再加,急!
{
_variant_t TheValue;
CDynRec *ptemprec = new CDynRec;
try
{
ptemprec->m_pRecordset->Open(_bstr_t(sSQL),m_pConnection.GetInterfacePtr(),
adOpenStatic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
delete e;
if(ptemprec != NULL)
delete ptemprec;
return 0;
}
catch(...)
{
int count = m_pConnection->Errors->GetCount ();
for(long i = 0; i < count; i ++)
{
m_pError = m_pConnection->Errors->GetItem (_variant_t(i));
AfxMessageBox ((char*)m_pError->Description);
}
if(ptemprec != NULL)
delete ptemprec;
return 0;
}
CDynRec* prst;
BOOL bExist;
POSITION pos;
for(long id = 1;;id++)
{
bExist = FALSE;
pos = m_recs.GetHeadPosition ();
while(pos != NULL)
{
prst = m_recs.GetNext (pos);
if(prst->m_id == id)
{
bExist = TRUE;
break;
}
} if(!bExist)
{
ptemprec->m_id = id;
break;
}
} m_recs.AddTail(ptemprec); return ptemprec->m_id;
}m_pConnection是一个已经连上数据库的_ConnectionPtr.
CDynRec构造析构函数如下:
CDynRec::CDynRec()
{
m_pRecordset.CreateInstance(__uuidof(Recordset));
}CDynRec::~CDynRec()
{
m_pRecordset.Release();
}
类CDynRec 封装了_RecordsetPtr,每个由此函数返回的CDynRec 指针在使用完后会马上被delete,所以m_recs(Clist)的数据个数维持在5以下。
数据库是oracl8.1.7,使用系统数据源。该函数被调用大概4700多次后开始出错在ptemprec->m_pRecordset->Open(_bstr...)
错误描述是"ODBC driver does not support the requested properties."
请问高手,什么原因?分数再加,急!
CDynRec::~CDynRec()
{
m_pRecordset.Close();
}
2.
for(long id = 1;;id++)
很容易死循环,建议改改
3.
_variant_t TheValue;没用
4.
你无非是看一个ID是否在纪录理有无,若无就把ID赋给ptemprec
好好找找recordset的关闭,用Close
5.
ptemprec似乎需要MoveNext
我所调用的关闭函数:
void CDyndb::CloseRec(long lid)
{
POSITION pos,posprev;
CDynRec *ptemprec;
if(lid == 0)
return; try
{
posprev = pos=m_recs.GetHeadPosition();
while(pos)
{
ptemprec=m_recs.GetNext(pos);
if(ptemprec->m_id == lid)
{
if (ptemprec->m_pRecordset->GetState() == adStateOpen)
ptemprec->m_pRecordset->Close();
m_recs.RemoveAt (posprev);
delete ptemprec;
return;
}
posprev = pos;
}
}
catch(...)
{
int count = m_pConnection->Errors->GetCount ();
for(long i = 0; i < count; i ++)
{
m_pError = m_pConnection->Errors->GetItem (_variant_t(i));
AfxMessageBox ((char*)m_pError->Description);
}
}
}
但问题还没有解决。
to LookSail(老得牙都掉了还在学) :
1:我不是在析构函数里close的,我是自己调用void CDyndb::CloseRec(long lid)关闭的。但你的建议很好。2:我认为除了效率低一些,它不可能死循环。5:??
不需要MoveNext???
我的使用方法:
void OnTimer(UINT id)
{
int RstID = m_Database.OpenRec (
"Select * from Upload_file where status is null");
if(0 == RstID)
{
return;
}
CDynRec *prst = m_Database.GetRec (RstID);
while(!prst->m_pRecordset->adoEOF)
{
ProcessFile((char*)_bstr_t(prst->GetFieldVal("Local_file_Name")),(long)(prst->GetFieldVal ("Enterprise_id").dblVal));
prst->SetFieldVal ("status",_variant_t((BYTE)1));
prst->m_pRecordset->MoveNext();
} m_Database.CloseRec (RstID);
}