特别有意义的dw_control.update()安全性讨论...
请大家看下面的一段常用代码:
uf_save_data()函数:
public int uf_save_data()
{
if dw_head.update() < 0 then
return -1
end if
if dw_body.update() < 0 then
return -1
end if
return 0
}
在cb_sava按钮的clicked事件中调用该uf_save_data()函数:
If MessageBox("提示","即将保存数据,是否继续!",Question!,YesNo!,1) <> 1 Then
Return
End If
If uf_save_data() < 0 Then
Rollback Using Sqlca;
MessageBox("提示","保存失败,请检查网络...")
Else
Commit Using Sqlca;
MessageBox("提示","保存失败,请检查网络...")
End If
------------------------------------------------------
就上面的常用代码存在严重的安全问题:
比如dw_head.update()执行成功,但是dw_body.update()执行不成功的时候,问题就出来了.
因为dw_head在update()执行成功以后dw_head.update()会自动重置所有缓冲区域所有行的更新标志,而dw_body.update()执行失败以后(不会重新置更新标志),跟着会返回-1,在cb_save的clicked事件中会Rollback 事务对象。用户根据错误提示更改了数据以后,重新单击cb_save按钮的时候,执行uf_save_data()函数,dw_head.update()根据各个缓冲区域的行状态将不会生成任何更新Sql语句(由于前面已经将更新标志给清除了),导致该更新的数据没有根新。
------------------------------------------------------
解决办法是 :
uf_save_data()函数:
public int uf_save_data()
{
if dw_head.update(true,false) < 0 then
return -1
end if
if dw_body.update(true,false) < 0 then
return -1
end if
dw_head.resetupdate()
dw_body.resetupdate()
return 0
}
问题点数:50、回复次数:12Top
1 楼rightyeah(众妙之门)回复于 2005-05-18 12:44:22 得分 0
不错,顶下先Top
2 楼j9dai(翔)(DoItNow)回复于 2005-05-18 13:09:49 得分 0
好贴Top
3 楼lzheng2001(1加1)回复于 2005-05-18 13:56:07 得分 0
就是用这种方法解决Top
4 楼hbdkfk(卡夫卡)回复于 2005-05-18 14:28:19 得分 0
学习Top
5 楼cuixuf(A4〓小小小小刀〓(...---...))回复于 2005-05-18 14:38:08 得分 0
学习...Top
6 楼nimittz(尼米兹---------努力升星GOGOGO)回复于 2005-05-18 15:56:46 得分 0
呵呵,俺也发现了这个问题Top
7 楼li_d_s(鄙视那些不懂Java却跑来乱骂的人,.NET没啥了不起)回复于 2005-05-18 16:09:39 得分 0
好贴Top
8 楼MyOhMyXP(MyOhMy)回复于 2005-05-18 17:57:05 得分 0
学习!!!Top
9 楼w7a8(阿飞)回复于 2005-05-19 11:35:18 得分 0
markTop
10 楼wqzone(wqzone)回复于 2005-05-26 18:07:43 得分 0
大家都多发表一点意见呀,不要关说好...Top
11 楼princelily(百合)回复于 2005-05-27 08:52:11 得分 50
同意,我也是这么做的。update()函数中指定两个参数。控制更新标志。Top
12 楼wqzone(wqzone)回复于 2005-05-30 02:19:12 得分 0
go onTop




