rs.Recordcount 有10条记录
rs.Filter = "No='A'";
然后有3条。
我想得到如何把这3条写到另一个rs1中。
不用clone,因为clone会把另外7条也复制过去。
我看了一下只能循环作AddNew,请问如何用呢???

解决方案 »

  1.   

    DataTable t = new DataTable();
    foreach(DataRow r in rs.Select("No = 'A'"))
    {
        t.ImportRow(r);
    }不知道有没有问题
      

  2.   

    呵呵,不妨换个思路来做,既然Filter对Clone无效,那么何不先Clone,然后再Filter呢?
      

  3.   

    MSDN上有这样一段描述:
    The Filter property of the original Recordset, if any, will not be applied to the clone. Set the Filter property of the new Recordset in order to filter the results. The simplest way to copy any existing Filter value is to assign it directly, like this: rsNew.Filter = rsOriginal.Filter这里说的“not be applied”是指不会对Clone后的新rs起作用呢?还是像 hxm20003 (hxm20003) 所说的那样,是对Filter之后的Clone也不起作用呢?但是我总是觉得Filter影响的应该是rs对象本身,Clone的话,应该是Clone出Filter之后的结果,而不应该是原始的rs。思考中......
      

  4.   

    找了MSDN上的一个例子(“Filter and RecordCount Properties Example (VB)”)测试了一下,结果的确如 hxm20003 (hxm20003)  所说,Clone出来的rs与原始rs一样。想了想,我的解释是这样:Clone方法拷贝了原始rs的所有属性值,包括Source,所以这时的rs所指向的记录集是按照Source查询出来的,与Filter属性无关,而且从上面那段话可以看出来,在Clone的时候,Filter属性是没有被拷贝的。再测试了一下自己的想法,突然明白了,ADO使用的是服务器端的游标,所以Recordset其实是没有状态信息的,它的所有信息都要通过服务器端游标来获取,即使你只查看一下RecordCount,用SQL Server的事件探查器也可以看出这一点,ADO会使用sp_cursorfetch这个系统存储过程来获取信息。呼,又学到新东西而且巩固了旧知识,真是不错!;),(说了很多题外话。呵呵)
      

  5.   

    string sFilter = "No='A'";
                DataRow[] Find = dr.Tables[0].Select(sFilter);
    foreach(DataRow dr in Find)
    {
    foreach(DataColumn dcTemp in dr.Tables[0].Columns)
    {
    DataRow drTemp = dr1.Tables[0].NewRow();
    drTemp[dcTemp] = dr[dcTemp];
    }
                    dr1.Tables[0].Rows.Add(drTemp);
    }
    前提是dr和dr1的结构一样
      

  6.   

    我后来想了一个变通的办法,就是把Fliter的数据删除,这样就可以达到效果了。
    while (!rs.EOF)
    {
    if (rs.Fields["logi_prop_1"].Value.ToString() != sLp1)
    rs.Delete(AffectEnum.adAffectCurrent);
    rs.MoveNext();
    }