问大家个问题
我在用SqlDataAdapter更新数据库的时候,如果出现并发的情况会有许多相同的数据,怎么处理啊

解决方案 »

  1.   

    yuewh491(帅的惊动了党) ( ) 信誉:15 
    长相问题.性欲:15
      

  2.   

    有没可能是update时造成的数据重复
      

  3.   

    就是在Update的时候,在做压力测试,同时有十个人向一张表做插入的操作,就会有重复的数据,我用了事务也不管用啊
      

  4.   

    yuewh491(帅的惊动了党) ( ) 信誉:15 
    长相问题.性欲:15
    ----------------------------------------
    那是我删自己帖子给扣的分,不会不给各位分数的,留着又不能变钱
      

  5.   

    DataSet ds = new DataSet();
                SqlConnection scon = new SqlConnection("server=;uid=sa;pwd=123;database=aaa");
                SqlDataAdapter da = new SqlDataAdapter("select * from ccc", scon);
                SqlCommandBuilder cb = new SqlCommandBuilder(da);
                scon.Open();
                da.Update(ds, "ccc");
                scon.Close();用SqlCommandBuilder  实现批量更新     1.功能:         可以实现你对DataSet在UI层做任意操作后,直接丢给这个方法,这个方法就可以自动把你的修改更  新到数  据库中,而没必要每次都更新到       数据库     2.使用方法  
       public  DataSetUpdateByDataSet(DataSet  ds,string  strTblName,string  strConnection)  
       {  
               SqlConnection    conn  =  new  SqlConnection(strConnection));  
                       
             SqlDataAdapter  myAdapter  =  new  SqlDataAdapter();  
             SqlCommand  myCommand  =  new  SqlCommand("select  *  from  "+strTblName),(SqlConnection)  conn);          
             myAdapter.SelectCommand  =  myCommand;  
             SqlCommandBuilder  myCommandBuilder  =  new  SqlCommandBuilder(myAdapter);            
       try             {                                   lock(this)                        //处理并发情况(分布式情况)                             {                               myAdapter.Update(ds,strTblName);                                 }             }      
       
       catch(Exception  err)  
    {       conn.Close();        
         throw  new  BusinessException(err);  
    }         return  ds;        //数据集的行状态在更新后会都变为:  UnChange,在这次更新后客户端要用返回的ds  }  或  public  DataSet  UpdateByDataSet(DataSet  ds,string  strTblName,string  strConnection)  
       {  
           
         
               SqlConnection    conn  =  new  SqlConnection(strConnection));                    
               SqlCommand  myCommand  =  new  SqlCommand("select  *  from  "+strTblName),(SqlConnection)  conn);                     SqlDataAdapter  myAdapter  =  new  SqlDataAdapter(myCommand  );                   SqlCommandBuilder  myCommandBuilder  =  new  SqlCommandBuilder(myAdapter);            
                 
               myAdapter.InsertCommand  =  myCommandBuilder  .GetInsertCommand();             myAdapter.UpdateCommand  =  myCommandBuilder  .GetUpdateCommand();           myAdapter.DeleteCommand  =  myCommandBuilder  .GetDeleteCommand();       try     {                 lock(this)                                                            //处理并发情况(分布式情况)               {                             conn.Open();                             myAdapter.Update(ds,strTblName);                                 conn.Close();               }  
         
                     return  ds;        //数据集的行状态在更新后会都变为:  UnChange,在这次更新后客户端要用返回的ds  }  
    catch(Exception  err)  
    {               conn.Close();    
               throw  new  BusinessException(err);  
    }  
    }  直接调用这两个方法的任意一个就OK啦,说明的一点是select  *  from  "+strTblName是一定要的,  
    作用大家也应该想到了,主要是告诉  SqlDataAdapter更新哪个表  
    3.什么时候用?         a.  有时候需要缓存的时候,比如说在一个商品选择界面,选择好商品,并且进行编辑/删除/更新后,               最后一并交给数据库,而不是每一步操作都访问数据库,因为客户选择商品可能进行n次编辑/删除               更新操作,如果每次都提交,不但容易引起数据库冲突,引发错误,而且当数据量很大时在用户执行               效率上也变得有些慢         b.有的界面是这样的有的界面是这样的,需求要求一定用缓存实现,确认之前的操作不提交到库,点击             页面专门提交的按钮时才提交商品选择信息和商品的其它信息.  我经常遇到这样的情况         c.有些情况下只往数据库里更新,不读取.  也就是说没有从数据库里读,SqlDataAdapter也就不知道是  
               
               更新哪张表了,调用Update就很可能出错了。这样的情况下可以用SqlCommandBuilder  了.  
                       4.  
    注意点:    
       1.只能更新一个表,如果此数据集是从两个或者两个以上的表关联而来的,则不能用此方法自动更新  
       2.表中必须设置主键  
       3.更新的表中字段不能有image类型的  5.优点:         节省代码量,节省时间,这个方法可以代替所有的:    更新/删除/插入操作语句  6.缺点:  
                   访问两次数据库(select  *  TableName,就是这句,要确认是哪个表,除非是很大的数据量,  
                   一般是感觉不到的),效率稍微有些慢  
      

  6.   

    更新数据库的时候,如果出现并发的情况会有许多相同的数据 
    怎么会呢? 在SQL中增删改 是隐式事物。  有独占锁定的。
      

  7.   

    yuewh491(帅的惊动了党) ( ) 信誉:15  2007-07-24 17:19:08  得分: 0  
     
     
       yuewh491(帅的惊动了党) ( ) 信誉:15 
    长相问题.性欲:15
    ----------------------------------------
    那是我删自己帖子给扣的分,不会不给各位分数的,留着又不能变钱
      
     
    -----------------
    我也删了自己好多贴呢
      

  8.   

    yuewh491 (帅的惊动了党) 性欲:15--------
    我靠,这种性欲,不行
      

  9.   

    这也有这种担忧:举个例子:你把读出在dataset.tables(0)中,对dataset.tables进行大量修改,同进,别人也对数据库进行了变更,那保存就会出现并发冲突。不保存,客户花了半个小时对其进行修改,客户不愿意,请问,该如何处理?
    其次:sqldataadapter.update可以采用并发锁吗?