/*************删除Score表中指定的记录****************/
try{
m_sqlDel="delete from Score where StuID='5'";
if (m_pSet->IsOpen())
{
m_pSet->Close();
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"select * from Score order by StuID",CRecordset::readOnly);
m_pSet->MoveFirst();
UpdateData(false);
}
else
{
m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"select * from Score order by StuID",CRecordset::readOnly);
UpdateData(false);
}
//执行删除操作
m_pSet->m_pDatabase->ExecuteSQL(m_sqlDel);
m_pSet->m_pDatabase->CommitTrans();
}
catch(CDBException e)
{
AfxMessageBox("事务处理失败!");
m_pSet->m_pDatabase->Rollback();
}
我打开的方式是CRecordset::readOnly,他怎么还是能够删除掉了呢?记录集不是只读的吗?怎么能够删除呢?请高人帮助。

解决方案 »

  1.   

    你是用m_pDatabase对象执行SQL语句删除的,跟记录集没关系..
    只读的话,不能通过调用 m_pSet->Delete删除..
      

  2.   

    那我怎么样才能rollback()呢。
      

  3.   

    当出现异常的时候,就会执行catch中的rollback.
      

  4.   

    我就是想删除第一个表的时候,正常删除。
    然后删除第二个表的时候,出现异常。但是第二个表,我是这样打开的
    m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,"select * from Score order by StuID",CRecordset::readOnly);
    这样删除的
     m_pSet->m_pDatabase->ExecuteSQL(m_sqlDel);
    他竟然也正确删除了,没有出现异常。
    我的意思是,怎么样才能在删除第二个表的记录时,删不了呢。
      

  5.   

    CRecordset::readOnly 针对记录集只读,所以你m_pSet->Delete()不以删,但是直接执行SQL语句是可以删的..
    如果你要让它执行SQL也不能删,则可以把ACCESS文件设成只读属性..
      

  6.   

    操作之前先要启动事务.
    m_pSet->m_pDatabase->BeginTrans();