.NET后都是在本地編輯數據,再更新到數據源,可是這個並發問題如何控制?
謝謝!

解决方案 »

  1.   

    并发可采用 update 表 set 字段1='' ,字段2=‘’ where 字段1=‘原先的字段’ and 字段2=‘原先的字段’
      

  2.   

    在表的构造中新建一个标志为列,tinyint,每操作一次表中的数据,相应行的标志为加1,
    在操作数据的时候首先判断该标志位是否发生变化~
      

  3.   

    可以在表里设置一个最终更新时间字段,每一次取数据的时候,把时间保存下来的,再更新的时候拿这个时间和数据库的时间比较,如果相等说明没有人改过,如果不相等,说明被人修改过了。更新的时候把这个字段更新成NOW
      

  4.   

    先謝謝各位!
    只是答案不夠理想啊
    如果我把數據寫顯示在DataGridView中,修改后再更新回數據源,各位的方法能不能應付過來?
      

  5.   

    楼主所讲的并发,其实是由数据库管理器DBMS自己控制的,没有手动加锁的情况下,谁先提交(insert,update,delete),就先执行谁的,如果有多个用户同时提交,这里的并发由DBMS处理,一般情况下用户是不需要考虑的.
      

  6.   

    經過測試
    如果在DataGridView中編輯後更新到數據源時
    如查某一行被其他人編輯過,那這一行是更新不了的
    如果ContinueUpdateOnError設為false,那整個GRID中的數據都不能更新到數據源
    此時有沒有辦法得到是哪些行已經被編輯過?
      

  7.   

    采用sql 自己的事务也行啊
      

  8.   

    呵呵,现在才发现,楼主是想通过DataAdapter.Update(Dataset)的方式更新数据库.
    这样确实会产生并行性错误,其实是DataAdapter自己的控制,它在更新每一笔记录之前,会检查那笔记录是否已更改过,如果改动过,就会弹出并发错误.具体楼主自己看DataAdapter生成的Update字符串便知道.解决方法有几种:
    1、向上面网友说的,在数据库里记录哪些记录已更改过,但需要在更新前判断。2、手动写DataAdapter的Update字符串,Where后只检查主键。3、通过Command.ExecuteNonQuery()来执行更新修改。
      

  9.   

    正如ydsunny所說
    不過所說的第2、3點不是很明白:
    2.手动写DataAdapter的Update字符串:是不是要為GRID中的每一條記錄都下UPDate語句?
    3.通过Command.ExecuteNonQuery()来执行更新修改:這點跟我說的問題如何聯系?
    謝謝了!
      

  10.   

    2、如果楼主你的SqlDataAdapter是在界面拖进去的,你可设置UpdateCommand的CommandText属性,把比较记录是否改动的部分删掉,如下表(tblEntity,有两个字段:Entity_Id,Entity_Name,其中,Entity_Id为主键),系统生成的代码如下:
    UPDATE [tblentity] SET [Entity_Id] = @Entity_Id, [Entity_Name] = @Entity_Name WHERE (([Entity_Id] = @Original_Entity_Id) AND ((@IsNull_Entity_Name = 1 AND [Entity_Name] IS NULL) OR ([Entity_Name] = @Original_Entity_Name)));
    SELECT Entity_Id, Entity_Name FROM tblEntity WHERE (Entity_Id = @Entity_Id)
    删掉检验部分后,变成:UPDATE tblEntity
    SET Entity_Id = @Entity_Id, Entity_Name = @Entity_Name
    WHERE (Entity_Id = @Entity_Id);  
    SELECT Entity_Id, Entity_Name FROM tblEntity WHERE (Entity_Id = @Entity_Id)
    这样改动之后,更新时就不会楼主之前碰到的并发错误问题。当然,在代码里写SqlDataAdapter的参数也行。
    3、通过Command.ExecuteNonQuery()来执行更新修改,就是不用DataAdapter.Update方法,而是通过枚举DataSet一条一条记录进行更新,这样也不会出现并发错误,而且可以更灵活地控制。