您的位置:程序门 -> .net技术 -> web services



关于web service与开放式并发的一个奇怪的问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于web service与开放式并发的一个奇怪的问题[已结贴,结贴人:ygacmilan]
发表于: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就不行,更奇怪的就是在没有并发冲突时,更新操作倒是正常的!
        它请各位高手解答,万分感谢!
发表于:2007-04-29 10:00:181楼 得分:50
你的web   service都没有返回值,你怎么检测到能否成功了?
public   void   updateexam(dataset   dseducation)
发表于:2007-04-29 10:41:262楼 得分:0
不需要返回值,直接读取提交的dseducation就可以了。
应该不是这个问题,因为没有并发冲突时,是可以正常更新的
发表于:2007-04-29 13:46:333楼 得分:0
已解决,参数传递有问题,多谢net_lover提醒!


快速检索

最新资讯
热门点击