none
请教关于DataTable.ImportRow ()方法 RRS feed

  • 问题

  •  

    今天想操纵虚拟表DataTable,可是创建了DataRow对象往DataTable.Rows里添加时总说此行已经属于另一个表,于是想到了ImportRow这个方法,但是使用后,发现DataTable.Rows并没有添加值。
    缩略代码如下:

    Code Snippet
    DataTable dt = new DataTable();
                DataColumn dc = new DataColumn("name",System.Type.GetType("System.String"));
                dt.Columns.Add(dc);
                DataRow dr = dt.NewRow();
                dr["name"] = "aaa";
                dt.ImportRow(dr);
                MessageBox.Show(dt.Rows.Count.ToString());

     

     

    大家用过这个方法没?谈下心得。
    2008年11月28日 12:14

答案

  • 你说“因为NewRow()是依据dt的架构来创建一个新行,并不属于dt,并且我的程序MessageBox.Show(dt.Rows.Count.ToString())得到的就是0,说明dt未有任何行”。

    你这样说并不正确,使用NewRow()来创建一个DataRow的确会创建一个隶属于当前DataTable的且架构相同DataRow,要理解这个,你首先要理解DataRow的状态,这由DataRowState枚举暴露出来,请看以下MSDN的解释:

    Detached

    该行已被创建,但不属于任何 DataRowCollectionDataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。

    Unchanged

    该行自上次调用 AcceptChanges 以来尚未更改。

    Added

    该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。

    Deleted

    该行已通过 DataRow Delete 方法被删除。

    Modified

    该行已被修改,AcceptChanges 尚未调用。


    看到Detached状态了吗?当你用NewRow()方法来创建出了一个新的DataRow时而且没有使用Add()方法加入当前DataTable时,它的状态就是Detached,你可以使用DataRow.RowState 属性来验证。虽然dt.Rows.Count.ToString()结果是零,但是你调用DataRow.Table属性时,就会返回当前的DataTable。当你调用Add方法添加DataRow,它的状态就会变为Added。

    因此使用NewRow方法()创建出的DataRow隶属于DataTable是绝对正确的。

    我这样说,你能够明白吗?

    顺便说一句,如果我的解答解决了你的疑问,就请将其标记为“正确解答”,谢谢!~
    2008年11月29日 16:14

全部回复

  • ImportRow()方法不是这样使用的,它是将已经存在的DataRow复制到新的DataTable,请你看看下面的使用示例:

    SQL1 = "select name as 姓名 ,age as 年龄 from users";  
    //---- datatable1
    SQL1 = "select name as 姓名 ,age as 年龄 from Employee";
    // ----datatable2
     //将datatable2中的所有记录合到datatable1中
     //使用DataTable.ImportRow 方法,将 DataRow 复制到DataTable 中,保留任何属性设置以及初始值和当前值。
    DataRow[] foundRows = datatable2.Select();
    for(int i= 0;i<foundRows.Length;i++)
    {
        datatable1.ImportRow(foundRowsIdea);
    }

    2008年11月28日 12:38
  • 至于说“添加时总说此行已经属于另一个表”,你可以这样解决:

    DataTable dt = new DataTable();
    //dr=所要添加到dt的DataRow。
     //dt.Rows.Add(dr[);  出错提示为:该行已经属于另一个表 解决方法
     dt.Rows.Add(dr.ItemArray);


    祝你好运!~
    2008年11月28日 12:42
  • Code Snippet

     

    dt.Rows.Add(dr);

     

     

    ImportRow一般用在将一个表导入到另外一个表

     

    例如

    DataTable dt = new DataTable();
    DataColumn dc = new DataColumn("name", System.Type.GetType("System.String"));
    dt.Columns.Add(dc);
    for (int i = 0; i < 10; i++)
    {
      DataRow dr = dt.NewRow();
      dr["name"] = "aaa";
      dt.Rows.Add(dr);
    }


    DataTable dt2 = new DataTable();
    DataColumn dc2 = new DataColumn("name", System.Type.GetType("System.String")); 
    dt2.Columns.Add(dc2);

    for (int i = 0; i < dt.Rows.Count; i++)
    {

      dt2.ImportRow(dt.Rows[i]);
    }


    MessageBox.Show(dt.Rows.Count.ToString());
    MessageBox.Show(dt2.Rows.Count.ToString());

     

     

    2008年11月28日 12:52
    版主
  •  

    呵呵,谢谢你们的回复,我试过了,你的代码是正确的,可我还是不明白,自己的代码问题出在哪里呢?

    麻烦帮我分析下。我ImportRow()里面也传的是DataRow对象啊,为什么就不成功呢?

    2008年11月28日 15:04
  •  

    我定义的dr也是存在的呀,监视得到值,我试比较了你们发出的代码,还真看不出来原因是为什么。

    麻烦你帮我分析下吧。最后顺便问下table.ImportRow()方法传递的参数DataRow应该和table拥有相同的结构吧。

    我用的table.NewRow得到的应该也是和table相同的结构,那么问题是否会出现于NewRow()上面呢?我不得其解。

    2008年11月28日 15:11
  • 你首先要明白,ImportRow()方法必须是用来将其他表的DataRow复制到当前的表,如果是复制自己的DataRow毫无意义,是不会成功的。请看你写的代码:

               DataTable dt = new DataTable();
                DataColumn dc = new DataColumn("name",System.Type.GetType("System.String"));
                dt.Columns.Add(dc);
                DataRow dr = dt.NewRow();
                dr["name"] = "aaa";
                dt.ImportRow(dr);
                MessageBox.Show(dt.Rows.Count.ToString());


    第一句和第二句红色的代码就导致了使用importRow是不会成功的,因为首先dt.NewRow()方法就会创建一个和dt这个dataTable相关联的行,也就是说你已经指定这个dr就是属于dt的,你再用dt.ImportRow(dr)方法,这表示向dt复制一个属于自己的DataRow,这当然就不会成功了。

    至于你问table.ImportRow()方法传递的参数DataRow应该和table拥有相同的结构吗?
    这当然是一定的了。
    2008年11月29日 2:00
  •  

    MSDN上的解释“

    DataRow 复制到 DataTable 中,保留任何属性设置以及初始值和当前值。

    ”并没有指明是哪个表的行,所以我当初弄错,不过要说明一点的就是,你说dr= dt.NewRow()指明dr本身就是dt的,我觉得这个说法不妥,因为NewRow()是依据dt的架构来创建一个新行,并不属于dt,并且我的程序MessageBox.Show(dt.Rows.Count.ToString())得到的就是0,说明dt未有任何行。不知道我的说法对不对,还请指教。

    另外我写这个需求就是两张表,tableA,和tableB,A表有字段A,B,C。 B表有字段A,B,C,D,E,B表是从数据库中读出来的一条记录集,我创建了一个A表的新行dr去接收B表的A,B,C三个字段的值,再想把此dr导入回A表, 故用了ImprotRow的方法,你说的ItemArray我现在试下。呵呵,谢谢了。

    2008年11月29日 7:44
  • 你说“因为NewRow()是依据dt的架构来创建一个新行,并不属于dt,并且我的程序MessageBox.Show(dt.Rows.Count.ToString())得到的就是0,说明dt未有任何行”。

    你这样说并不正确,使用NewRow()来创建一个DataRow的确会创建一个隶属于当前DataTable的且架构相同DataRow,要理解这个,你首先要理解DataRow的状态,这由DataRowState枚举暴露出来,请看以下MSDN的解释:

    Detached

    该行已被创建,但不属于任何 DataRowCollectionDataRow 在以下情况下立即处于此状态:创建之后添加到集合中之前;或从集合中移除之后。

    Unchanged

    该行自上次调用 AcceptChanges 以来尚未更改。

    Added

    该行已添加到 DataRowCollection 中,AcceptChanges 尚未调用。

    Deleted

    该行已通过 DataRow Delete 方法被删除。

    Modified

    该行已被修改,AcceptChanges 尚未调用。


    看到Detached状态了吗?当你用NewRow()方法来创建出了一个新的DataRow时而且没有使用Add()方法加入当前DataTable时,它的状态就是Detached,你可以使用DataRow.RowState 属性来验证。虽然dt.Rows.Count.ToString()结果是零,但是你调用DataRow.Table属性时,就会返回当前的DataTable。当你调用Add方法添加DataRow,它的状态就会变为Added。

    因此使用NewRow方法()创建出的DataRow隶属于DataTable是绝对正确的。

    我这样说,你能够明白吗?

    顺便说一句,如果我的解答解决了你的疑问,就请将其标记为“正确解答”,谢谢!~
    2008年11月29日 16:14
  •  

    嗯,我知道了,就是这个隶属于很讨厌啊,因为不能让它加入别的datatable了。即使是游离的行也不能假如别的datatable
    2008年11月30日 1:39
  •  橘隐 写:

     

    嗯,我知道了,就是这个隶属于很讨厌啊,因为不能让它加入别的datatable了。即使是游离的行也不能假如别的datatable

     

    这也是不得已为之   要是datarow都是随意漫游的   那做点遍历操作成本就大了

    2008年12月1日 4:38