【数据表test】
COL1(int) COL2(real) COL3(int)
1 40 0
2 20 1
3 30 1
4 40 1
5 10 1
6 20 2
7 30 2
8 50 3
9 60 3【触发器】
CREATE TRIGGER TR_TEST on test
AFTER INSERT, DELETE, UPDATE
ASSET NOCOUNT ONDECLARE @sum_col2 real select @sum_col2 =(select sum(t.col2) from test t, DELETED d where t.col3=d.col1)
if(@sum_col2 >100) -- 确保col2之和不大于100
begin
raiserror ('Col2之合不能大于100!',16,1) --抛出错误
rollback transaction
endSET NOCOUNT OFF
【VC程序】CString sValue, sql;
float fValue;
CADORecordset* prs=new CADORecordset(&pDoc->m_adoConn);
try
{
DWORD dwID=5; // COL1=5的记录
sql.Format(_T("SELECT * FROM test WHERE COL1=%d;"), dwID);
// 更新数据库数据
if(prs->Open(sql, CADORecordset::openUnknown))
{
prs->MoveFirst();
prs->SetFieldValue(_T("COL2"), 20); // <--修改记录,将COL2的值从10修改为20;
if(!prs->Update()) {prs->Close(); delete prs;} // 【疑问1】<--能成功执行,没有捕捉到错误消息,通过打开SQL Server服务器之后查看数据并没有被修改,应该是被服务器的 触发器 回滚了。
} // 读取更新后的数据库数据
prs->GetFieldValue(_T("COL2"), fValue); // 【疑问2】<--在执行完上述更新语句之后能获得COL1=5的这条记录COL2的值是修改后的20????

prs->Close(); // 【疑问3】<--执行到此处捕捉到错误,即跳转到catch块
delete prs;
}
catch (_com_error e)
{
MessageBox(e.ErrorDescription()); // 弹出对话框提示“Col2之合不能大于100!”
}
【问题】
1、为什么在rps->Update()的时候没有捕捉到服务端的回滚错误提示?
2、在执行完Update之后查看数据库数据没有被修改,COL1=5的记录的COL2的值还是10,并没有被修改成20,但是在客户端VC程序运行的时候获取的数据确实20?
3、为什么在prs->Close()的时候才捕捉到错误,从而跳转到catch块进行错误处理?
4、另外,触发器抛出的错误如何才能捕捉,如果我把delete prs;语句放到catch块中,程序会崩溃,为什么?