天高地厚

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Datatable的基本操作 .

Posted on 2013-01-31 09:00  天高地厚-GNU  阅读(269)  评论(0编辑  收藏  举报

做项目中遇到这样一个问题:需要实现策略应用功能,首先需要查询的是都有那些策略,之后根据策略名把该策略名下在用策略放在右边的下拉框,把不再用的策略放在左边下拉框,然后可以再这里设置可用或者不可用。

 

而当是设计数据库表的时候这三个地方的数据都在一个表中。如果分别查询的时候需要调用三次数据库,这不仅增加了数据库的压力,而且还增加了好多代码量。

所以,我们可以通过一次查询,在通过对datatable的操作来实现。

那么,我们如何从datatable中获取我们想要的数据呢?

DataTable newdt = new DataTable();

newdt=dt.Clone();

DataRow[] dr = dt.Select(condition);

for(int i=0;i<dr.Length;i++)

{

newdt.ImportRow((DataRow)dr[i]);

}

 

这里最值得注意的就是datatableselect方法的使用。

关于DataTable.Select();Select方法:

 

Select();//全部查出来

Select(过滤条件);//根据过滤条件进行过滤,如Select("columnname1 like '%xx%'");

Select(过滤条件,排序字段);//过滤,并排序,如Select("columnname1 like '%xx%'",columnname2);

 

通过select便可以把我们需要的信息查询出来。

下面是我们程序中的代码:

//获取需要查询的字段

            String strStrategy= ddlStrategy.SelectedValue;

            //构造查询条件

            string condition ="strategyType = '" + strStrategy + "'";

            //获取数据

            DataTabledatStrategy = QueryAllStrategy();

            //根据条件查询数据

            DataRow[] dr =datStrategy.Select(condition);

 

            //清空列表的所有信息

            lstNotInUse.Items.Clear();

           lstInUse.Items.Clear();

 

 

            //循环获取需要的数据

            for (int i = 0; i< dr.Length; i++)

            {

                //根据数据判断需要分别加载到哪一个listbox

                if(dr[i]["state"].ToString() == "f")

                {

                    ListItemliNotInUse = new ListItem();

                   liNotInUse.Text = dr[i]["name"].ToString();

                   liNotInUse.Value = dr[i]["id"].ToString();

                    //加载到为使用策略

                    this.lstNotInUse.Items.Add(liNotInUse);

                }

                else

                {

                    ListItemliInUse = new ListItem();

                   liInUse.Text = dr[i]["name"].ToString();

                   liInUse.Value = dr[i]["id"].ToString();

                    //加载到使用策略

                   this.lstInUse.Items.Add(liInUse);

                }

 

            }

在这里,因为数据要绑定到listbox,所以直接循环绑定,当然也可以把它通过ImportRow来把信息独到其他的datatable中。

 

Datatable除了selectimportrow以后,还有两个重要的方法,就是copyclone,其中, DataTable.Clone(),复制表结构,也就是对象的深拷贝,在c#里面,有浅拷贝和深拷贝的区别。浅拷贝,只拷贝对象的数据,对对象的修改,都将影响到原对象。深拷贝,会从新分配一个地址,保存一个对象,对新对象的修改,不会影响到原有程序。DataTable .Copy(),复制datatable结构和数据。

通过对datatable的操作,我们就可以减少对数据库读取的次数,同时也减少了代码量,一举多得!