以下是我的更新本地dataSet事件        
        private void buttonUp_Click(object sender, EventArgs e)
        {
            SqlCommandBuilder sb = new SqlCommandBuilder(da);
            DataTable dt = this.dataGridView1.DataSource as DataTable;
            if (da != null)
            {
                da.RowUpdated += new SqlRowUpdatedEventHandler(RowUpdate);
                da.Update(dt);
            }
        }        private void RowUpdate(object sender, SqlRowUpdatedEventArgs e)  
        {
            //如果数据库中的原始数据已经被其他操作更改,    更新或删除,   我怎么获取这种出错的行? 
        }

解决方案 »

  1.   

    C#的DataTable的行有几种状态:Added:表示行已添加到DataRowCollection,尚未调用DataTable.AcceptChange()
    Modified:表示行已被修改,尚未调用DataTable.AcceptChange()
    Deleted:表示行已被删除,
    Unchanged:自上次调用AcceptChange()之后没有更改的行.
    Detached:行虽然创建,但没有放到DataRowCollection中.MSDNhttp://msdn.microsoft.com/zh-cn/library/system.data.datarowstate.aspx
      

  2.   

    我感觉你的updatecommand 自己写语句 然后加标志 记录更新失败的行的行号并返回到一个List中?
      

  3.   

    数据库中加个字段 ts timestamp 类型 非空。
    界面别显示这个字段 但是要存储。更新数据的时候 可以用这个字段和数据库的对比。相同的话,数据库的数据就是没变化过的。反之,就是被别人操作过的。
      

  4.   

    数据库里面有 updated和deleted表 表示已经更新和删除了的历史记录表 利用这2个表 试下
      

  5.   

    十几年前的时候ado就已经能够支持并发处理了,
    楼主这个情况应该采用悲观加锁(现在叫做悲观并发)
    具体参考MSDN:
    http://social.msdn.microsoft.com/Forums/zh-CN/adonetzhchs/thread/e86a7bed-4ff1-4e98-9685-4b66645f07fb/
      

  6.   

    用linq to sql  ,如果你提交的数据,和数据库中的数据库不一致,会抛出一个冲突的异常
      

  7.   

    你的这个需求有点怪。
    我理解的是这样的,你库里有个表,有一行数据。
    你的页面a.aspx显示了这个数据,a.aspx可能修改这个数据。
    二种情况:
    第一种:
    当A,B两个用户都是通过网站修改这个数据的,比如B修改了,A用户正在看a.aspx的时候就要自动刷新。
    解决方法。
    任何一个用户在做数据update的时候都,写入一个全局的表中。所有用户ajax访问页面get.ashx来获取数据是否被更新了,然后ajax更新当前页面。
    第二种:
    当A用户都通过网站浏览数据的,B通过其它方式比如直接写库改数据时。
    二种方案:
    1、人不多时:加个字段,写的时候都写入系统时间,当时间变化时更改。如果是对全表中任一数据都敏感。就做个触发器,修改另一个表字段中的时间字段,Ajax轮询这个时间,不一样就ajax刷新。
    2、人多,数据库不能轮询:触发器调dbms_pipe 发管道消息。网站这边ajax到处理页从管道里得消息,决定是否刷新(此方法具体实现本人不了解)