zoukankan      html  css  js  c++  java
  • DataSet、DataTable、DataRow的数据复制方法

    DataSet 对象是支持 ADO.NET的断开式、分布式数据方案的核心对象 ,用途非常广泛.我们很多时候需要使用其中的数据,比如取得一个DataTable的数据或者复制另一个DataTabe中的数据或者是DataRow的数据,但是只有DataSet和DataTable的复制是支持深层复制的,就是说不仅能复制元素的结构,而且能复制元素的数据,而DatatDataRow没有相关的复制的方法,下面将简单介绍下这些数据元素的复制问题。

    DataTable sourceTable;
    DataTable objectTable;
    DatatDataRow sourceRow;
    DatatDataRow objectRow;
    DataRow tempRow;
    DataSet souceDataSet = new DataSet();

    复制DataSet

      DataSet object = souceDataSet.Copy();//深复制
      DataSet object = souceDataSet.Clone();//浅复制,只复制架构

    复制DataTable

      objectTable  = sourceTable .Copy();//深复制
      objectTable  = sourceTable .Clone();//浅复制,只复制架构

    那我们应该如何复制DataRow的数据了,下面将着重介绍几种方法
    _____________________________________________________________________________________________________

    ImportDataRow方法:public void ImportDataRow( DataRow DataRow);

    objectTable = sourceTable.clone();//必须先复制表的架构,使具有相同的的列或关系!
    foreach (DataRow oRow in sourceTable)

    objectTable.ImportDataRow(oRow);//在objectTable中添加一个新行,并将sourceRow的值复制进去,要求表的结构一样!

    }

    _____________________________________________________________________________________________________

    自定义复制

    objectTable.Columns.Add ("id");//不需要有一样的架构,只复制自己需要的列!
    Object [] myArry = new Object [1];
       foreach (DataRow oRow in sourceTable)

      tempRow = objectTable.NewRow();//此方法必须调用!
      myArry[0] = oRow["id"];//如果myArry中没有源表中的id列的话就会报错!
      tempRow.ItemArray = myArry;//ItemArray属性为Object类型数组,根据程序的需要需要可自行复制多个列的数据!
      objectTable.Rows.Add(tempRow); //此方法必须调用,否则DataRow中的数据将不能显示!

    }
    _____________________________________________________________________________________________________

    LoadDataRow方法:public DataRow LoadDataRow(Object[] values,bool fAcceptChanges);

    Object[] newRow = new Object[3];
       // 设置对象数组的值
        newRow[0] = "Hello";
        newRow[1] = "World";
        newRow[2] = "two";
        DataRow myRow;
        ObjectTable.BeginLoadData();
        // 将新行添加到表中
        myRow = ObjectTable.LoadDataRow(newRow, true);//标志要设置为true,表示添加新行
        ObjectTable.EndLoadData();
    该方法比较复杂,如果只是简单的复制现有行的数据来添加新行的话建议不要采用,具体用法请参看sdk文挡。

    ----

    DataRow的复制

                如果直接通过RequirDT.Rows.Add(row),则运行时会出现"该行已经属于一个表"的提示错误!

                至于其中的原因,通过DataSet和DataTable类比,从通常意义来说应该不会出现错误提示,但是细细

                想来,我觉得应该是由于DataTable的架构设计所致,借鉴关系数据库中的关系表,datacolumn定义了

                DataTable的整体架构,而具体的datarow是符合该架构的一条记录罢了!所以具有该架构的行只能添加

               到具有相同架构的表中!同时RequireDT.Rows.Add()实现捕获 System.ArgumentException(The row

                ther belongs to another table or ready belongs to this table.)我想其实现也限制了不能通过该方法实现!

               鉴于以上

                1.ataTable RequireDT = SourceDT.Clone();

                 RequireDT.ImportRow(row);

                2.见网上有这样实现的 RequireDT.Rows.Add(row.ItemArray)

                但是我编写代码并不能实现,该函数的功能是   Creates a row using specified values and adds it to the

                System.Data.DataRowCollection.所以也需要先拷贝源数据表的结构,方可成功!

               3. 以下方法也可以实现,但是也得先复制表的结构

                ObjectTable.BeginLoadData(); 
      
                myRow = ObjectTable.LoadDataRow(newRow, true);


                ObjectTable.EndLoadData();

    ___________________________________________________________________________________________________
    总结:
    当我们要把一个DataTable的行复制到另一个DataTable中去的时候不能直接用ObjectTable.Add(souceDataRow);,或者是用ObjectRow = sourceRow 的赋值,然后Add,这样错编译器会提示你 "此行已属于别的表",对于DataTable来说也是这样,因为这样对象都是引用类型的。.Net不允许别的表来引用一个已经属于当前表的行或者别的DataSet来引用当前DataSet中的DataTable,必须用以上的方法先进行复制;对于采取和何种方法复制将完全取决于您程序的需要。

  • 相关阅读:
    OutputCache 缓存key的创建 CreateOutputCachedItemKey
    Asp.net Web Api源码调试
    asp.net mvc源码分析DefaultModelBinder 自定义的普通数据类型的绑定和验证
    Asp.net web Api源码分析HttpParameterBinding
    Asp.net web Api源码分析HttpRequestMessage的创建
    asp.net mvc源码分析ActionResult篇 RazorView.RenderView
    Asp.Net MVC 项目预编译 View
    Asp.net Web.config文件读取路径你真的清楚吗?
    asp.net 动态创建TextBox控件 如何加载状态信息
    asp.net mvc源码分析BeginForm方法 和ClientValidationEnabled 属性
  • 原文地址:https://www.cnblogs.com/me115/p/2008818.html
Copyright © 2011-2022 走看看