对于datatable,使用 sqldataadapter.update(tb1)功能,是不是这个表的所有字段都会更新呢?不管用户是否修改过?
---------------------------------------------------------------------
比如 datagridview 中的数据,与datatable 绑定,
假如 datatable 的名字是 tb1 (为说明问题,随便起个名字)
sqldataadpater对象执行 sda.update(tb1) 来更新用户修改过的数据。(假设 sqldataadapter对象的名字是 sda)再假如 datatable 有10个字段,但是用户其实只会修改其中2个(其余8个字段仅仅是显示给用户查询)
下面就是我想问的问题:
执行 sda.update(tb1);后,每条记录是不是所有字段全部更新(即就算其余8个字段从来不会被修改,也会被相同的值覆盖一次)。再着重说明一下,我是问是不是所有字段(列)都会得到更新,我不是问所有记录(行)会不会更新,因为我可以只更新被修改过的行,比如用 tb1.GetChanges()就可以取到被修改过的记录。从未修改过的记录,是不会被更新的。
但是好象没有办法选择哪些字段进行更新,好象只要更新,就会更新所有字段。我想确认一下,我的理解对吗?

解决方案 »

  1.   

    datagridview更新
    DataSet ds = new DataSet();
    SqlDataAdapter sda;SqlCommandBuilder scb = new SqlCommandBuilder(sda);
    sda.Update(ds);
    this.dataGridView1.DataSource = ds.Tables[0];
     
    http://msdn.microsoft.com/zh-cn/library/at8a576f(v=VS.90).aspx
     
      

  2.   

    不会。你修改,删除,添加 的字段DATATABLE会自动做好标记,他只更新标记的列
      

  3.   

    刚开始我也是这样以为,但是自从我看了 sqlcommandbuilder 构造的更新语句,才发现不是这样的。
    你不信看看 自动生成的update语句,每个字段都会更新的。
      

  4.   

    说错了。不是字段。。而是行他根据行来生成SQL的
      

  5.   

    老大,能解答一下我问的问题吗?我想确认一下,我的理解对不对。
    即:
    执行 sda.update(tb1)
    时,会更新记录中的全部字段。对于用户永远不会更改的字段,也会用相同的值覆盖一次。
    我自已找不到验证的方法。所以不知道自已的理解对不对?
      

  6.   

    我告诉你一个验证方法:
    USE NorthwindCREATE TRIGGER tr1 ON Customers
    FOR UPDATE AS
       print COLUMNS_UPDATED()
    GOUPDATE Customers 
       SET ContactName=ContactName,
          Address=Address,
          Country=Country
    GO在查询分析器中执行,然后用Windows自带的计算器,把print得到的值展开为二进制,就知道了
      

  7.   

    DataTable中会有一列用于标识此行数据是否会变动.如果变动置为true,默认false.
    在更新的时候,会自动检测已变动的行,进行更新。对于没有变动的行,不会进行更新。
      

  8.   

    COLUMNS_UPDATED实现的有点别劲这么说吧:先说COLUMNS_UPDATED返回值你取到的是1401,拆开就是0001 0100 0000 0001
    其中0001 0100是高位,0000 0001是低位,以字节为单位,按每字节8位,进行反转(字节的顺序不变,肉眼看是从左到右,但在一个字节的内部位,是从右到左)
    可得0010 1000 1000 0000你看到了吧,3,5,9列,的值是1,代表被执行了更新实际上:ContactName=ContactName这种语语,代表的是不更新,直接赋原值.这说明,在SQL语句中,直接赋原值,也会导致列的值被更新,只是更新前和更新后的值是相同的.然后再说DataAdapter你也能看出来,DataAdapter是依赖UpdateCommand执行更新的,UpdateCommand实际上就是执行一条Update xxx....语句所以,只要UpdateCommand的SQL语句中指定要更新的列,肯定存在一个列的值被相同的值进行改写的问题.