每次执行完 删除或更新后, 在插入数据是就会提示"对象关闭时,不允许操作"
有办法解决吗?(因该和插入数据,删除数据,更新数据无关吧)我是这样插入数据的
BOOL CWDatabase::AddMachineToTeam(const TCHAR *pszTeam, CList<CString, CString&> *MachineList, const UINT uState)
{
try
{
VARIANT va;
POSITION pos = MachineList->GetHeadPosition();
while(pos)
{
m_spRecordset->AddNew();
CString strMachineID = MachineList->GetNext(pos);
va.lVal = uState;
va.vt = VT_INT; m_spRecordset->PutCollect( "MACHINE_TEAM", pszTeam );
m_spRecordset->PutCollect( "MACHINE_ID", (_bstr_t)strMachineID );
m_spRecordset->PutCollect( "STATE", va );
}
m_spRecordset->AddNew(); return TRUE;
}catch( _com_error e )
{
AfxMessageBox( e.Description() );
return FALSE;
}
}

解决方案 »

  1.   

    没有关..  我没有调用关闭的代码..!! --!
    删除..
    BOOL CWDatabase::DeleteMachineTeam(const TCHAR *pszTeam)
    {
    try
    {
    TCHAR szSQL[200];
    _stprintf( szSQL, _T("delete from MachineTab where MACHINE_TEAM = '%s'"), pszTeam );
    m_spRecordset.CreateInstance( __uuidof( Recordset ) );
    m_spRecordset->Open( szSQL, m_spConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText ); return TRUE;
    }catch( _com_error e )
    {
    AfxMessageBox( e.Description() );
    return FALSE;
    }
    }更新..
    BOOL CWDatabase::UpdataMachineTeam(const TCHAR *pszTeamName, const TCHAR *pszNewName, const UINT uState)
    {
    try
    {
    if( strcmp( pszTeamName, pszNewName ) )
    {
    if( FindMachineTeam( pszNewName ) ){
    return FALSE;
    }
    } TCHAR szSQL[200];
    _stprintf( szSQL, _T("UpDate MachineTab set MACHINE_TEAM = '%s' where MACHINE_TEAM = '%s'"), pszNewName, pszTeamName );
    m_spRecordset.CreateInstance( __uuidof( Recordset ) );
    m_spRecordset->Open( szSQL, m_spConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText ); return TRUE;
    }catch( _com_error e )
    {
    AfxMessageBox( e.Description() );
    return FALSE;
    }
    }
      

  2.   

    因为你有三个方法,在delete和update里都那它进行了实例及数据集加载操作。但在addnew里没看到。m_spRecordset是否全局的?最重要的是:你在delete方法里使用的 delete 语句
    update方法里使用的 update 语句然后使用
    recordset.open "语句",游标状太等 
    这样的方式去执行delete 或update。要知道,这样的语句指 "delete from ..." 和 " update 表" .. 是不返回记录集的(也即关闭的)。
    也就是说,就算你的m_spRecordset是全局的,即 在 addnew 时操作的是 update或delete后产生的那个recordset实例, 而上面说了,它们本身得到的就是关闭的记录集(或者说未得到记录集)
      

  3.   


    楼上的意思是说在AddMachineToTeam插入数据里也用SQL语句插入数据而不是用addnew插入是吗?
      

  4.   

    不是这个意思。插入可以用sql的insert语句,
    也可以用 recordset的 addnew方法。但后者有个前提,当前recordset必须是打开的。
    为了语句表示方便,我以basic来描述。 你应该可以看明白。还是ado的方法,换了个简单语法而已。
    rs代表recordset的实例, conn代表 connection实例比如rs.open "select * from tb",conn,1,3
    rs.addnew
    这是可行的rs.open "select * from tb",conn,1,3
    rs.close
    rs.addnew
    这是不可行的,因为rs当前是关闭的。
    你的问题与第二点类似
    rs.open "delete from tb where id=132",conn,1,3 --这里不管游标状态怎么写,这个语句,是不是返回记录集的,也即得不到记录集,也就是记录未打开。
    rs.addnew 这里当然会出错。
      

  5.   

    谢谢fcuandy !
        问题已经清楚了, 我用SQL的insert语句重做了(其实你介绍的第2种方法还是不太懂^^!)
      

  6.   

    主要意思是说
    执行m_spRecordset->Open("delete from tb where id=1332" /*或是update语句*/, m_spConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText ); 这种方式,是不返回记录的,也就是说你执行后 m_spRecordset 没有被打开。所以接下来 addnew 就不会成功。