| 发表于:2007-04-28 17:32:46 楼主 |
最近在写一个基于web service的应用程序,碰到了一个奇怪的问题。 功能比较简单,定义了一个educationdata类,它直接与数据库进行交互,完成数据的读写、更新等操作,一个web service类educationservice,它只是简单的调用educationdata类中相应的方法,向用户公开公开了 geteducationdata、updateexam等方法。 在客户端调用web service没有问题,数据读取,更新一切都正常,但在有数据并发冲突的时候出现了问题。 educationdata类中,updateexam实现大致是这样的:并发采用的策略是与数据库中的原始值比较,若在更新时有冲突发生(更新出现错误,在数据库中找到该条数据,一同反馈给用户,我做了一个弹出窗口,包括原始数据和当前数据,供用户选择如何处理),主要代码如下: private sqldataadapter daexam; private sqldataadapter daconflict; private dataset dsconflict; daexam.rowupdated += new sqlrowupdatedeventhandler(onrowupdated); public dataset updateexam(dataset dsexam) { try { daexam.update(dsexam, "exam "); dsexam.merge(dsconflict, true); } catch (dbconcurrencyexception dbex) { eventloghelper.logerror(dbex.message); } return dsexam; } private void onrowupdated(object sender, sqlrowupdatedeventargs e) { if ((e.status == updatestatus.errorsoccurred) && (e.errors.gettype() == typeof(dbconcurrencyexception))) { daconflict.selectcommand.parameters[0].value = e.row[ "id "]; int count = daconflict.fill(dsconflict, "exam "); if (count == 1) { e.row.rowerror = "modified "; } else { e.row.rowerror = "deleted "; } e.status = updatestatus.continue; } } 问题出现的比较奇怪:当我在客户端直接调用educationdata类中的updateexam方法时,可以正常工作,客户端可以接收到出现冲突的信息,弹出窗口,而调用 web service类educationservice类的updateexam方法时,它没有任何反应,只是更新不成功,日志里也没有任何错误信息。 我通过注释掉 daexam.rowupdated += new sqlrowupdatedeventhandler(onrowupdated); 这时日志提示:出现并发错误。但由于注释掉了rowupdated 事件,无法将冲突的数据反馈! 这是educationservice中updateexam方法的定义,不能正常工作: [webmethod(description = "update exam ")] public void updateexam(dataset dseducation) { educationdata tempdata = new educationdata(); tempdata.updateexam(dseducation); } 这是我在客户端直接调用educationdata的updateexam方法,可以正常工作: educationdata tempdata = new educationdata(); tempdata.updateexam(dschanges); 百思不得其解,educationservice仅仅只是调用了educationdata中相应的方法,educationdata可以正常处理,而educationservice就不行,更奇怪的就是在没有并发冲突时,更新操作倒是正常的! 它请各位高手解答,万分感谢! |
|
|
|
|