对象关闭时,不允许操作?

liu199184 2008-08-28 04:55:40
每次执行完 删除或更新后, 在插入数据是就会提示"对象关闭时,不允许操作"
有办法解决吗?(因该和插入数据,删除数据,更新数据无关吧)

我是这样插入数据的
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;
}
}
...全文
225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-08-28
  • 打赏
  • 举报
回复
主要意思是说
执行

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

所以接下来 addnew 就不会成功。
liu199184 2008-08-28
  • 打赏
  • 举报
回复
谢谢fcuandy !
问题已经清楚了, 我用SQL的insert语句重做了(其实你介绍的第2种方法还是不太懂^^!)
fcuandy 2008-08-28
  • 打赏
  • 举报
回复
不是这个意思。

插入可以用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 这里当然会出错。
liu199184 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fcuandy 的回复:]


因为你有三个方法,在delete和update里都那它进行了实例及数据集加载操作。但在addnew里没看到。m_spRecordset是否全局的?

最重要的是:

你在delete方法里使用的 delete 语句
update方法里使用的 update 语句

然后使用
recordset.open "语句",游标状太等
这样的方式去执行delete 或update。

要知道,这样的语句指 "delete from ..." 和 " update 表" .. 是不返回记录集的(也即关闭的)。
也就是说,…
[/Quote]

楼上的意思是说在AddMachineToTeam插入数据里也用SQL语句插入数据而不是用addnew插入是吗?
fcuandy 2008-08-28
  • 打赏
  • 举报
回复


因为你有三个方法,在delete和update里都那它进行了实例及数据集加载操作。但在addnew里没看到。m_spRecordset是否全局的?

最重要的是:

你在delete方法里使用的 delete 语句
update方法里使用的 update 语句

然后使用
recordset.open "语句",游标状太等
这样的方式去执行delete 或update。

要知道,这样的语句指 "delete from ..." 和 " update 表" .. 是不返回记录集的(也即关闭的)。
也就是说,就算你的m_spRecordset是全局的,即 在 addnew 时操作的是 update或delete后产生的那个recordset实例, 而上面说了,它们本身得到的就是关闭的记录集(或者说未得到记录集)
liu199184 2008-08-28
  • 打赏
  • 举报
回复
没有关.. 我没有调用关闭的代码..!! --!
删除..
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;
}
}
dawugui 2008-08-28
  • 打赏
  • 举报
回复
应该是被锁住了.
fcuandy 2008-08-28
  • 打赏
  • 举报
回复
更新或删除完成后,是否关闭了记录集。

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧