每次执行完 删除或更新后, 在插入数据是就会提示"对象关闭时,不允许操作"
有办法解决吗?(因该和插入数据,删除数据,更新数据无关吧)我是这样插入数据的
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;
}
}
有办法解决吗?(因该和插入数据,删除数据,更新数据无关吧)我是这样插入数据的
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;
}
}
删除..
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;
}
}
update方法里使用的 update 语句然后使用
recordset.open "语句",游标状太等
这样的方式去执行delete 或update。要知道,这样的语句指 "delete from ..." 和 " update 表" .. 是不返回记录集的(也即关闭的)。
也就是说,就算你的m_spRecordset是全局的,即 在 addnew 时操作的是 update或delete后产生的那个recordset实例, 而上面说了,它们本身得到的就是关闭的记录集(或者说未得到记录集)
楼上的意思是说在AddMachineToTeam插入数据里也用SQL语句插入数据而不是用addnew插入是吗?
也可以用 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 这里当然会出错。
问题已经清楚了, 我用SQL的insert语句重做了(其实你介绍的第2种方法还是不太懂^^!)
执行m_spRecordset->Open("delete from tb where id=1332" /*或是update语句*/, m_spConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText ); 这种方式,是不返回记录的,也就是说你执行后 m_spRecordset 没有被打开。所以接下来 addnew 就不会成功。