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."
请问高手,什么原因?分数再加,急!

解决方案 »

  1.   

    你open()了, 在哪里close()啊?
      

  2.   

    1.
    CDynRec::~CDynRec()
    {
    m_pRecordset.Close();
    }
    2.
    for(long id = 1;;id++)
    很容易死循环,建议改改
    3.
    _variant_t TheValue;没用
    4.
    你无非是看一个ID是否在纪录理有无,若无就把ID赋给ptemprec
    好好找找recordset的关闭,用Close
    5.
    ptemprec似乎需要MoveNext
      

  3.   

    我保证所有的recordset在用完后都马上关闭了。
    我所调用的关闭函数:
    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);
    }
    }
    }
      

  4.   

    非常感谢LookSail(老得牙都掉了还在学) 和 zhang1000(多一个零)。
    但问题还没有解决。
    to LookSail(老得牙都掉了还在学) :
    1:我不是在析构函数里close的,我是自己调用void CDyndb::CloseRec(long lid)关闭的。但你的建议很好。2:我认为除了效率低一些,它不可能死循环。5:??
      

  5.   

    你的每个CDynRec里面的m_pRecordset都只有一行纪录???
    不需要MoveNext???
      

  6.   

    在open时,我没有使用recordset里的数据。
    我的使用方法:
    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);

    }