今天写代码的时候用到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);
 
这样操作的话,有点画蛇添足,不建议使用!

DataTable.ImportRow()与DataTable.Rows.Add()的区别的更多相关文章

  1. C#中DataTable中Rows.Add 和 ImportRow 对比

    最近参加项目中,数据操作基本都是用DataTable的操作,老代码中有些地方用到DataTable.Rows.Add又有些代码用的DataTable.ImportRow,于是就对比了一下 VS查询说明 ...

  2. 【转载】C#的DataTable类Clone及Copy方法的区别

    在C#中的Datatable类中,Clone方法和Copy方法都可以用来复制当前的DataTable对象,但DataTable类中的Clone方法和Copy方法还是有区别的,Clone方法只复制结构信 ...

  3. 在DataTable中执行DataTable.Select("条件")返回DataTable;

    转:http://blog.csdn.net/hcf_force/article/details/7779062 1.在DataTable中执行DataTable.Select("条件&qu ...

  4. 在DataTable中执行DataTable.Select("条件")

     .在DataTable中执行DataTable.Select("条件")返回DataTable:  // <summary> // 执行DataTable中的查询返回 ...

  5. [datatable]两个DataTable 连接

    using System; using System.Collections.Generic; using System.Text; using System.Data; namespace Cons ...

  6. 多工段查询存放到DataTable到List<DataTable>集合在C#里面做汇总

    private void btnQuery_Click(object sender, EventArgs e) { if (cboxFactory.Text=="") { Mess ...

  7. C#;DataTable添加列;DataTable转List泛型集合;List泛型集合转DataTable泛型集合;

    给DataTable添加列 string sql = "select * from cgpmb order by code"; DataTable dt = Bobole.Data ...

  8. [datatable]关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法

    -- :09关于在DataTable中执行DataTable.Select("条件")返回DataTable的解决方法 在实际编程工程中,常常遇到这样的情况:DataTable并不 ...

  9. NPOI 将excel转换为datatable或者将datatable转换为excel

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

随机推荐

  1. leecode 归并排序 链表(java)

    写了好久,终于写成了.第一次zai leecode错题,题目质量很高,适合面试,与 1.归并排序是稳定的,在java中 Arrays.sort(a);中对于对象的排序就是归并排序.对于原子类型数据使用 ...

  2. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  3. NOIP2015 运输计划(二分+LCA+差分)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 308  Solved: 208[Submit][Status] ...

  4. 64位linux安装android sdk的问题

    截至到今天,似乎在64位机器下安装android sdk存在不能运行的问题,可以用以下方法解决: Android SDK requires: Fedora 17 64bit with 32bit An ...

  5. Jetty 8长连接上的又一个坑

    Jetty 8 长连接的超时断开连接的机制:超时连接机制针对IO传输过程中的数据阻塞时间超过一定阈值时,断开该连接.阻塞指当前处于数据传输阶段,但是连续指定时间内都没有发出或者接收到任何数据时,Jet ...

  6. android开源项目学习

    FBReaderJ FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb.ePub和fb2.此外还支持直接读取zip.tar和gzip等压缩文档. 项目地址:ht ...

  7. android93 进程优先级补充

    ###进程优先级(一个应用可以有多个进程,比如有Activity的进程和service的进程,)* 五种前台进程 * 拥有一个正在与用户交互的activity(onResume调用)的进程 * 拥有一 ...

  8. cocos2dx shader

    http://www.oschina.net/question/565065_79818 Cocos2d-x 2.0 -- 从 点,线,面学起 http://blog.csdn.net/dawn_mo ...

  9. cocos2d-x设计模式发掘之五:防御式编程模式

    http://www.ityran.com/archives/2105 本文由子龙山人原创,泰然授权转载,转载请注明出处并通知子龙山人! 声明:防御式编程是提高程序代码质量的一种手段,它不能算是真正意 ...

  10. 玩转Android之MVVM开发模式实战,炫酷的DataBinding!

    C# 很早就有了MVVM的开发模式,Android手机中的MVVM一直到去年Google的I\O大会上才推出,姗姗来迟.MVVM这中开发模式的优点自不必多说,可以实现视图和逻辑代码的解耦,而且,按照G ...