如果要使用DataAdapter来修改DataSet的子集时,请尽量对父级做修改。

一、概述

    由于DataSet是一个强关联性组件,并且开发历史悠久,难免很多使用习惯与现在不同,并且也存在不少的Bug。在此,就DataSet的更改问题,做一个提醒式的说明。



二、问题原因

    1.DataSet是一个强关联性的组件,它与外部的DataGridView、BindingNavigator和数据库等有着密切的联系,而且自身下面的子集,包括DataTable、DataRow、Cell等等,又有着密切的联系。因此,在更改它时,很容易引发问题。

    2.由于DataSet设计年代久远,并且其自身的结构非常复杂,因此,自身容易存在较多bug。并且,微软很多新产品,比如WCF,要对其进行完美支持,也是很难做到,事实上也是没有做到,从而导致很多问题。



三、问题表现例子

    1.WCF不能直接传输DataSet的子集。比如WCF传输DataTable时,有时会发现,DataTable里的数据没有被传递过去。

    2.当使用DataAdapter,进行Update DataRow时,在事件RowUpdated中,如果对参数e.Row进行修改,则会发现,e.Row确实能被修改,但从其父级来访问这个row,发现该row的数据依然没有被更改。



四.解决方案

    1.如果需要对DataSet的子集进行修改,则尽量修改父级,或者从父级入手来进行修改。比如,DataAdapter.Update(dataTable),最好改为:DataAdapter.Update(DataSet, "TableName")。

    2.尽量减少对DataSet以及子集的数据类型转换,防止变量的引用,被转换为值类型的复制。比如上文中的问题表现例子2。e.Row可能就是一个复制出来的值类型。



如果有任何问题,请加QQ群 68328977 来进行讨论。

 

你可能感兴趣的:(Adapter)