//=============================================================
//功能: 根据状态获得相关的信息
//参数: nType :状态(0正常,1特价,3推荐)
//参数: nCount :要返回的数据条数
//返回: 信息
//=============================================================
public static DataTable GetResultInfoByType(int nType, int nCount)
{
//int randnCount = nCount +10;这里可以增加参数多查询数据
//随机查询数据
strSql = "Select top " + nCount + " * From [Table_]
Where State =1 AND Type=" + nType + "
Order By NEWID()";
CDBConnect dbconn = new CDBConnect();
DataTable resultDataTable = dbconn.CreateDataTable(strSql);
dbconn.Close();
//DataTable.Select(string,string)用法:前一个是过滤字段,后面是排序字段(这儿可以升序和降序排序默认asc)
DataRow[] rows = resultDataTable.Select("Columns=filterColumns","orderColumn1 desc,orderColumn2 desc");
//这里注意若没有第一个参数要写成.Select("","orderColumn1 desc,orderColumn2 desc");形式
//这个是克隆原来的DataTable
DataTable tempDataTable = resultDataTable.Clone();
//清空不用说了吧
tempDataTable.Clear();
//把排好序的datarow要用导入行的方式DataTable.ImportRow(DataRow)
foreach (DataRow row in rows)
tempDataTable.ImportRow(row);
//如果只要输出前几个,用下面代码
//for (int i = 0; i < nCount; i++)
//{
// tempDataTable.ImportRow((DataRow)rows[i]);
//}
//把排好序的DataTable赋值给自己以前的DataTable覆盖
resultDataTable = tempDataTable;
return resultDataTable;
}这里主要用到了DataTable.Select的用法中的DataTable.Select(string,string)
具体见:
http://msdn.microsoft.com/zh-cn/library/way3dy9w(VS.80).aspx
以下是我结合实际对该用法讲解的总结。。。
1.在DataTable中执行DataTable.Select("条件","排序")返回DataTable;
// <summary>
// 执行DataTable中的查询返回新的DataTable
// </summary>
// sourceDataTable是源数据DataTable
//resultDataTable是目标数据DataTable
// conditionColumn 是查询条件
//orderColumn 是排序字段
DataTable resultDataTable = new DataTable();
resultDataTable = sourceDataTable.Clone();
// 克隆sourceDataTable 的结构,包括所有sourceDataTable架构和约束,并无数据;
DataRow[] rows = sourceDataTable.Select(conditions);
// 从sourceDataTable 中查询符合条件的记录;
foreach (DataRow row in rows) // 将查询的结果添加到sourceDataTable中;
{
resultDataTable.Rows.Add(row.ItemArray);
}
也可以这样:
DataTable resultDataTable = new DataTable();
resultDataTable=sourceDataTable.Clone();
DataRow[] rows =sourceDataTable.Select(condition);
for(int i=0;i<rows.Length;++i)
{
resultDataTable.ImportRow((DataRow)rows[i]);
}
2.关于DataTable.Select();
Select方法:
Select();//全部查出来
Select(过滤条件);//根据过滤条件进行过滤,如Select("columnname1 like '%xx%'");
Select(过滤条件,排序字段);//过滤,并排序,如Select("columnname1 like '%xx%'",columnname2);
适用:完成一个查询,返回一个DataTable后,很多时候都想在查询结果中继续搜索。这时可以使用DataTable.Select方法对结果进行再查询。
Select方法有4个重载,我们经常用到的就是DataTable.Select(String) ;
下面就说说带一个参数的DataTable.Select(String):
这个String的参数是查询的限定式。相当于SQL查询语言中的WHERE语句(不含WHERE),其语法符合SQL语言语法。
不过我试了试,不支持BETWEEN AND,举个成功的例子:
//FromTime 和ToTime 是两个DateTime类型的变量;occurTime是sourceDataTable里面的列名;
DataRow[] rows = sourceDataTable.Select("occurTime >= '" + FromTime + "' and occurTime <= '" + ToTime+"'");
另外DataTable.Select()方法里面支持简单的过滤和排序,不支持复杂的条件过滤和排序。里面的字符串必须是列名和数据,以及>,<,=,<>等关系运算符。举几个例子:
DataRow[] rows = sourceDataTable.Select("WZMC='"+MaterialName+"' and CZ='"+MaterialTexture+" and GG='"+MaterialSpecs+"'");
DataTable.Select("City Like 'B%'");
DataTable.Select("name='" + a +"'");
一定要注意单引号的问题:若变量只用双引号括起来会一直出错。要先有双引号,再用单引号;即‘“变量”’。
总之:就是要实现下面这个方法
public void getDataRows(DataTable sourceDataTable, ref DataRow[] rows)
{
//一行代码就搞定。
rows = sourceDataTable.Select("Columns=filterColumns", "orderColumns Asc");
}
另外网上还有下面几种供参考:
一、重生法
dstaset.Tables.Add(sourceDataTable)
dataset.Tables(0).DefaultView.Sort = "id desc"
--------------------------------------------------------------------------------
二、直接法
resultDataTable = New DataView(sourceDataTable)
resultDataTable.Sort = "id desc"
--------------------------------------------------------------------------------
三、間接法
resultDataTable= New DataView(sourceDataTable.Tables[0])
resultDataTable.Sort = "id desc"
DataRow[] rows = sourceDataTable.Select("", "orderColumn asc");
DataTable resultDataTable=sourceDataTable.Clone();
resultDataTable .Clear();
foreach (DataRow row in rows)
resultDataTable.ImportRow(row);
sourceDataTable =resultDataTable;
VS中这种方法最简单:
DataView temDataTable; = sourceDataTable.DefaultView;
temDataTable.Sort = "orderColumn Asc";
DataTable resultDataTable = temDataTable.ToTable();
----
//拿到数据源
DataView temDataTable = this.dtDataSource.Copy().DefaultView;
//排序
temDataTable.Sort = "Columns1 asc,Columns2 asc,Columns3 asc";
//过滤重复数据
//DataTable resultDataTable= temDataTable.ToTable(true, "Columns1", "Columns2", "Columns3");
//不过滤重复数据
DataTable resultDataTable = temDataTable.Table.Copy();