首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

关于开放式并发的一个奇怪的有关问题

2012-01-10 
关于开放式并发的一个奇怪的问题最近在写一个基于webservice的应用程序,碰到了一个奇怪的问题。功能比较简

关于开放式并发的一个奇怪的问题
最近在写一个基于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(dsEducation);

        百思不得其解,EducationService仅仅只是调用了EducationData中相应的方法,EducationData可以正常处理,而EducationService就不行,更奇怪的就是在没有并发冲突时,更新操作倒是正常的!
        它请各位高手解答,万分感谢!


[解决办法]
没有用过,帮顶

热点排行