柚子Nan--回归原点

Everything can be as easy as you like or as complex as you need.
posts - 232, comments - 984, trackbacks - 17, articles - 29
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2004年7月8日

 

在操作DataTable 的时候,还会遇到一个常见的问题,对于DataTable中的某些行修改了状态,
我是指的人工显式的修改了,例如如下的代码:

//对于新的表增加一个状态列,表明是否访问过

        DataTable tempTable = dtDataTable[i].Copy();

        tempTable.Columns.Add("Visited",typeof(bool));

        foreach(DataRow tempRow in tempTable.Rows)

        {

            tempRow["Visited"] = false;

        }

 

//然后对于某些行进行操作,同时修改了状态

    foreach(DataRow aDataRow in tempTable.Rows)

    {

        if(aDataRow["StepNo"].ToString())

        {

            aDataRow["TotalPrice"]=0

            aDataRow["Visited"] = true;

        }

    }

那么最后tempTable中就会有一些Row的列Visited = false的。如何找到这些列呢?

 

当然就与本文的题目对应

DataRow []unVisitedRows = tempTable.Select("Visited = false"); 

显然他返回的是一个DataRow的数组,接下来如何对数组中的每个行如何操作,就不用说了。有一点要注意的是我的
上一个
Blog中提到的

DataSet,DataTable.DataRow复制方法——解决:此行已属于另一个表

 

另外,public DataRow[] Select( string filterExpression)

filterExpression 这个参数还可以使用 and ,or 等等操作符,例如:filterExpression 
= " id='D' or stepnt<>'' "

posted @ 2004-07-08 10:56 柚子Nan 阅读(1170) | 评论 (0)编辑

最近项目太忙了,几乎没有时间来光顾这里了
在项目中除了负责自己的模块实现外,还做了一个不太称职的
TeamLeader

由于负责的模块很多数据的操作,经常遇到这种错误,“此行已属于另一个表”的错误。

 

导致这个错误的语句如下:

dtPriceTable.Rows.InsertAt(aDataRow,i);

或者

dtPriceTable.Rows.Add(aDataRow);

 

我分析了一下原因,因为DataRow DataTable 都是传引用调用的。所以一个行在一个表中了,就不能再增加到另外一个表。

 

具体的改善策略有两种:

1、   把原始DataRow的每列依次赋值。如下:

DataRow tempRow = dtItemPrice.NewRow();

tempRow ["First"] = aDataRow ["First "]

tempRow ["second"] = aDataRow ["second "]

tempRow ["third"] = aDataRow ["third "]

tempRow ["forth"] = aDataRow ["forth "]

tempRow ["Fifth"] = aDataRow ["Fifth "]

……

 

dtPriceTable.Rows.Add(tempRow)

2、  有个同事提醒我为什么不循环DataTable的每个列呢?我想是哦,为什么不呢!

呵呵,这样子,不管Table有多少列,只需要3句话就搞定了

DataRow aDataRow = dtItemPrice.NewRow();

    foreach(DataColumn aDataColumn in dtItemPrice.Columns)

    {

 aDataRow[aDataColumn.ColumnName] = drItemPrices[i][aDataColumn.ColumnName];

    }

InsertConditionType(aDataRow,dtItemPrice);

 

测试就可以了。

后来看了看DataSet DataTable 都有一个方法:Copy(),复制该 System.Data.DataTable 的结构和数据。

 

那么结合这个函数,无论是DataSet DataTable还是DataRow 都有复制的方法了

posted @ 2004-07-08 10:35 柚子Nan 阅读(3839) | 评论 (6)编辑