【数据表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块中,程序会崩溃,为什么?
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块中,程序会崩溃,为什么?
解决方案 »
- VC/MFC怎么改变状态栏字体颜色和大小
- CEdit类的定义
- 加50分 =100分,求教Access数据库如何备份事务日志?如何查询事务日志
- 大家帮忙看看我显示图片时拖滚动条,图片随滚动条动的问题
- vc里的那个串口通讯控件,怎么知道想打开的串口已经打开
- 点下BUTTON按钮,实现保存文件的方法,最好给个小例子,谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢
- C语言基础知识,今天才知道错了,但是为什么?(记忆中老师或许说过)
- ■■■如何使含有非模式对话框的文档主窗口界面始终保持为选中激活状态???请高人指点迷津
- WIN32 SDK TreeView控件问题请教!
- 请教一个富有挑战性的问题,问遍DSCN无人答????????
- 夸平台的免费开源UI框架
- WTL中 如何修改树形框节点的名称 ?求代码解释
建议使用语句:
update test set col2=20 WHERE COL1=%d