zoukankan      html  css  js  c++  java
  • DataTable的ImportRow 和 add方法的区别

    今天写代码的时候用到ImportRow()向DataTable中添加记录,代码如下:

    DataTable dt = datatable;
    DataRow dr = dt.NewRow();
    dr["FileName"] = fileName;
    dr["DbName"] = DbName;
    dt.ImportRow(dr);


    可是执行后发现dtAppendix中的记录并没有增加。可是将上述红色色代码换成dt.Rows.Add(dr);就可以了。后上网查了下资料弄清楚了原因。下面就说一下这两者的用法与区别及其适用情况。

    1、首先,我们先说下DataTable.NewRow()方法,这个方法可以创建和表具有相同构架的DataRow(而且必须使用这个方法才能创建和原表一样构架的DataRow),并且这个新行是添加在原表上的。但是我发现这个DataTable中并没有这个空行。为什么?原因是这样的:原来Datatable中Rows都一个RowState属性,共有如下几种:

    1,Detached 该行已被创建,但不属于任何 DataRowCollection。DataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。
    2,Unchanged 该行自上次调用AcceptChanges以来尚未更改。
    3,Added 该行已添加到DataRowCollection中,AcceptChanges尚未调用。
    4,Deleted 该行已通过DataRow的Delete方法被删除。
    5,Modified 该行已被修改,AcceptChanges尚未调用。

    其实NewRow()创建的行其RowState是Detached,显而易见新建的行是不可见。


    2、ImportRow()
    将DateRow复制到DataTable中,保留任何属性设置以及初始值和当前值。但是当DataRow的RowState属性为Detached时无法复制,所以可见上述红色代码不可行了。网上有人说不能复制是因为新建的行隶属于原表,我认为这是不正确,究其原因很是因为行的属性。其实如果我们把行的属性改变的话,ImportRow()方法还是可行的。
    ImportRow()一般用于将一个表中的数据复制到另一个表中。实例代码如下:

    DataTable dtNew = dt.Clone();
    foreach (DataRow dr in dt.Rows)
    {
    dtNew.ImportRow(dr);
    }
     
    如果真的想使用ImportRow(),可以先增加一个空行,这样操作:
    DataTable dt = datatable;
    DataRow dr = dt.NewRow();
    dr["FileName"] = fileName;
    dr["DbName"] = DbName;
    dt.Row.add();
    dt.ImportRow(dr);
     
    这样操作的话,有点画蛇添足,不建议使用!
  • 相关阅读:
    Docker决战到底(三) Rancher2.x的安装与使用
    golang实现给图片加水印
    golang实现图片水印效果
    百度ueditor 编辑器使用问题收集
    重要的文件和数据,别放在/tmp下
    在CentOS 7上切换默认的java版本
    [转载]Centos和RedHat的区别和联系
    在Excel的公式框内输入换行符
    Outlook打不开,报错信息为“The time limit for logging on was reached while waiting for system resources. Try again. MAPI 1.0 [000004C2]”
    VMXNET3与E1000E与E1000的比较
  • 原文地址:https://www.cnblogs.com/hobby0524/p/7144436.html
Copyright © 2011-2022 走看看