各位大虾,江湖救急!俺用VC对SQLServer2K数据库进行事务处理操作的时候,发现如果再一次事务处理中使用了两个Insert语句,就会报告异常,内容如下:“在事务中,不能存在多个使用此游标类型的记录集,请更改游标类型、提交事务,或关闭其中某个记录集”但是俺试过,如果用SQL自带的查询分析器来进行相同的操作,就不会有这个问题,请问这是为什么?该如何解决?(
附 当时出错的几个语句:
try
{
pDB->m_pConnection->BeginTrans (); //开始事务处理
pDB->RunCommandEx ("insert语句1");
pDB->RunCommandEx ("insert语句2");
pDB->m_pConnection->CommitTrans (); //提交事务
}
catch(_com_error &e)
{
CString errormessage;  
errormessage.Format(_T("指令执行失败!\r\n\r\n错误信息:%s\n数据将会复原!!"),  (LPCTSTR)e.Description());  
AfxMessageBox(errormessage);
pDB->m_pConnection->RollbackTrans ();//事务处理回滚
})

解决方案 »

  1.   

    pDB->m_pConnection->BeginTrans ();//开始事务处理
    pDB->RunCommandEx ("insert语句1");
    pDB->m_pConnection->CommitTrans ();//提交事务
    pDB->m_pConnection->BeginTrans ();//开始事务处理
    pDB->RunCommandEx ("insert语句2");
    pDB->m_pConnection->CommitTrans ();//提交事务
      

  2.   

    To:nkeverstar(月亮之星)
    如果如这样写,那事务处理就毫无意义了,因为"insert语句1"和"insert语句2"在这里要求同时有效完成才行,如果像那样写,做完一个提交一个就没什么用了。
    另:原因俺知道了,在用Open运行SQL后,不管是那个语句都会返回一个记录集(RunCommandEx 是俺的自定义函数,实际运行时还使用的ADO的Open),这个记录集必须显式地释放才可以,以上的语句写成这样就没问题了:
    pDB->m_pConnection->BeginTrans ();//开始事务处理
    pRC=pDB->RunCommandEx ("insert语句1");
    if(pRC!=NULL)
    {
    pRC->Release();
    delete pRC;
    }
    pDB->RunCommandEx ("insert语句2");
    pDB->m_pConnection->CommitTrans ();//提交事务