从数据库随机查询出一批数据并排序输出——C#中DataTable技术学习

    //=============================================================
    //功能: 根据状态获得相关的信息
    //参数: 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();

 

 

 


版权声明:本文为Pet8766原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。