做项目中遇到这样一个问题:需要实现策略应用功能,首先需要查询的是都有那些策略,之后根据策略名把该策略名下在用策略放在右边的下拉框,把不再用的策略放在左边下拉框,然后可以再这里设置可用或者不可用。
而当是设计数据库表的时候这三个地方的数据都在一个表中。如果分别查询的时候需要调用三次数据库,这不仅增加了数据库的压力,而且还增加了好多代码量。
所以,我们可以通过一次查询,在通过对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]);
}
这里最值得注意的就是datatable的select方法的使用。
关于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除了select和importrow以后,还有两个重要的方法,就是copy和clone,其中, DataTable.Clone(),复制表结构,也就是对象的深拷贝,在c#里面,有浅拷贝和深拷贝的区别。浅拷贝,只拷贝对象的数据,对对象的修改,都将影响到原对象。深拷贝,会从新分配一个地址,保存一个对象,对新对象的修改,不会影响到原有程序。DataTable .Copy(),复制datatable结构和数据。
通过对datatable的操作,我们就可以减少对数据库读取的次数,同时也减少了代码量,一举多得!