asp.net DataTable相关操作集锦(筛选,取前N条数据,去重复行,获取指定列数据等)
?精品文档?
asp.net DataTable相关操作集锦(筛选,取前N条数据,去重复行,获取指定列数据
等)
本文实例总结了asp.net DataTable相关操作。分享给大家供大家参考,具体如下,
#region DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回
/// <summary
/// DataTable筛选,排序返回符合条件行组成的新DataTable或直接用DefaultView按条件返回
/// eg:SortExprDataTable(dt,”Sex=‘男’”,”Time Desc”,1)
/// </summary
/// <param name=“dt”传入的DataTable</param
/// <param name=“strExpr”筛选条件</param
/// <param name=“strSort”排序条件</param
/// <param name=“mode”1,直接用DefaultView按条件返回,效率较高;2,DataTable筛选,排序返回符合条件行组成的新DataTable</param
public static DataTable SortDataTable(DataTable dt,
string strExpr, string strSort, int mode)
{
switch (mode)
1 / 48
?精品文档?
{
case 1:
//方法一 直接用DefaultView按
条件返回
dt.DefaultView.RowFilter = strExpr;
dt.DefaultView.Sort = strSort;
return dt;
case 2:
//方法二 DataTable筛选,排序
返回符合条件行组成的新DataTable
DataTable dt1 = new DataTable();
DataRow[] GetRows = dt.Select(strExpr, strSort);
//复制DataTable dt结构不包含
数据
dt1 = dt.Clone();
foreach (DataRow row in GetRows)
{
2 / 48
?精品文档?
dt1.Rows.Add(row.ItemArray);
}
return dt1;
default:
return dt;
}
}
#endregion
---------------------------------------
#region 获取DataTable前几条数据
/// <summary
/// 获取DataTable前几条数据
/// </summary
/// <param name=“TopItem”前N条数据</param
/// <param name=“oDT”源DataTable</param
/// <returns</returns
public static DataTable DtSelectTop(int TopItem,
DataTable oDT)
{
if (oDT.Rows.Count < TopItem) return oDT;
DataTable NewTable = oDT.Clone();
DataRow[] rows = oDT.Select(“1=1”);
3 / 48
?精品文档?
for (int i = 0; i < TopItem; i++)
{
NewTable.ImportRow((DataRow)rows[i]);
}
return NewTable;
}
#endregion
----------------------------------------------
#region 获取DataTable中指定列的数据
/// <summary
/// 获取DataTable中指定列的数据
/// </summary
/// <param name=“dt”数据源</param
/// <param name=“tableName”新的DataTable的名词
</param
/// <param name=“strColumns”指定的列名集合
</param
/// <returns返回新的DataTable</returns
public static DataTable GetTableColumn(DataTable dt,
string tableName, params string[] strColumns)
{
4 / 48
?精品文档?
DataTable dtn = new DataTable();
if (dt == null)
{
throw new ArgumentNullException(“参
数dt不能为null”);
}
try
{
dtn =
dt.DefaultView.ToTable(tableName, true, strColumns);
}
catch (Exception e)
{
throw new Exception(e.Message);
}
return dtn;
}
#endregion
--------------------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
5 / 48
?精品文档?
using System.Data;
using System.Collections;
using System.Text;
namespace GuanEasy
{
/// <summary
/// DataSet助手
/// </summary
public class DataSetHelper
{
private class FieldInfo
{
public string RelationName;
public string FieldName;
public string FieldAlias;
public string Aggregate;
}
private DataSet ds;
private ArrayList m_FieldInfo;
private string m_FieldList;
private ArrayList GroupByFieldInfo;
private string GroupByFieldList;
6 / 48
?精品文档?
public DataSet DataSet
{
get { return ds; }
}
#region Construction
public DataSetHelper()
{
ds = null;
}
public DataSetHelper(ref DataSet dataSet)
{
ds = dataSet;
}
#endregion
#region Private Methods
private bool ColumnEqual(object objectA, object objectB)
{
if ( objectA == DBNull.Value
&& objectB == DBNull.Value )
{
7 / 48
?精品文档?
return true;
}
if ( objectA == DBNull.Value ||
objectB == DBNull.Value )
{
return false;
}
return
( objectA.Equals( objectB ) );
}
private bool RowEqual(DataRow rowA, DataRow rowB, DataColumnCollection columns)
{
bool result = true;
for ( int i = 0; i < columns.Count; i++ )
{
result &= ColumnEqual( rowA[ columns[ i ].ColumnName ], rowB[ columns[ i ].ColumnName ] );
}
return result;
8 / 48
?精品文档?
}
private void ParseFieldList(string fieldList, bool allowRelation)
{
if ( m_FieldList == fieldList )
{
return;
}
m_FieldInfo = new ArrayList();
m_FieldList = fieldList;
FieldInfo Field;
string[] FieldParts;
string[] Fields = fieldList.Split( ‘,’ );
for ( int i = 0; i <= Fields.Length - 1; i++ )
{
Field = new FieldInfo();
FieldParts = Fields[ i ].Trim().Split( ‘ ‘ );
switch
( FieldParts.Length )
9 / 48
?精品文档?
{
case 1:
//to be set at the end of the loop
break;
case 2:
Field.FieldAlias = FieldParts[ 1 ];
break;
default:
return;
}
FieldParts = FieldParts[ 0 ].Split( ‘.’ );
switch
( FieldParts.Length )
{
case 1:
Field.FieldName = FieldParts[ 0 ];
break;
case 2:
10 / 48
?精品文档?
if ( allowRelation == false )
{
return;
}
Field.RelationName = FieldParts[ 0 ].Trim();
Field.FieldName = FieldParts[ 1 ].Trim();
break;
default:
return;
}
if ( Field.FieldAlias == null )
{
Field.FieldAlias = Field.FieldName;
}
m_FieldInfo.Add( Field );
}
11 / 48
?精品文档?
}
private DataTable CreateTable(string tableName, DataTable sourceTable, string fieldList)
{
DataTable dt;
if ( fieldList.Trim() == ““ )
{
dt =
sourceTable.Clone();
dt.TableName = tableName;
}
else
{
dt = new DataTable( tableName );
ParseFieldList( fieldList, false );
DataColumn dc;
foreach ( FieldInfo Field in m_FieldInfo )
{
12 / 48
?精品文档?
dc = sourceTable.Columns[ Field.FieldName ];
DataColumn column = new DataColumn();
column.ColumnName = Field.FieldAlias;
column.DataType = dc.DataType;
column.MaxLength = dc.MaxLength;
column.Expression = dc.Expression;
dt.Columns.Add( column );
}
}
if ( ds != null )
{
ds.Tables.Add( dt );
}
return dt;
}
13 / 48
?精品文档?
private void InsertInto(DataTable destTable, DataTable sourceTable,
string fieldList, string rowFilter, string sort)
{
ParseFieldList( fieldList, false );
DataRow[] rows =
sourceTable.Select( rowFilter, sort );
DataRow destRow;
foreach ( DataRow sourceRow in rows )
{
destRow =
destTable.NewRow();
if ( fieldList == ““ )
{
foreach ( DataColumn dc in destRow.Table.Columns )
{
if ( dc.Expression == ““ )
{
14 / 48
?精品文档?
destRow[ dc ] = sourceRow[ dc.ColumnName ];
}
}
}
else
{
foreach ( FieldInfo field in m_FieldInfo )
{
destRow[ field.FieldAlias ] = sourceRow[ field.FieldName ];
}
}
destTable.Rows.Add( destRow );
}
}
private void
ParseGroupByFieldList(string FieldList)
{
if ( GroupByFieldList ==
15 / 48
?精品文档?
FieldList )
{
return;
}
GroupByFieldInfo = new ArrayList();
FieldInfo Field;
string[] FieldParts;
string[] Fields = FieldList.Split( ‘,’ );
for ( int i = 0; i <= Fields.Length - 1; i++ )
{
Field = new FieldInfo();
FieldParts = Fields[ i ].Trim().Split( ‘ ‘ );
switch ( FieldParts.Length )
{
case 1:
//to be set at the end of the loop
16 / 48
?精品文档?
break;
case 2:
Field.FieldAlias = FieldParts[ 1 ];
break;
default:
return;
}
FieldParts = FieldParts[ 0 ].Split( ‘(‘ );
switch
( FieldParts.Length )
{
case 1:
Field.FieldName = FieldParts[ 0 ];
break;
case 2:
Field.Aggregate = FieldParts[ 0 ].Trim().ToLower();
Field.FieldName = FieldParts[ 1 ].Trim( ‘ ‘, ‘)’ );
17 / 48
?精品文档?
break;
default:
return;
}
if ( Field.FieldAlias ==
null )
{
if ( Field.Aggregate == null )
{
Field.FieldAlias = Field.FieldName;
}
else
{
Field.FieldAlias = Field.Aggregate + “of” + Field.FieldName;
}
}
GroupByFieldInfo.Add( Field );
}
18 / 48
?精品文档?
GroupByFieldList = FieldList;
}
private DataTable
CreateGroupByTable(string tableName, DataTable sourceTable, string fieldList)
{
if ( fieldList == null || fieldList.Length == 0 )
{
return
sourceTable.Clone();
}
else
{
DataTable dt = new DataTable( tableName );
ParseGroupByFieldList( fieldList );
foreach ( FieldInfo Field in GroupByFieldInfo )
{
DataColumn dc
19 / 48
?精品文档?
= sourceTable.Columns[ Field.FieldName ];
if ( Field.Aggregate == null )
{
dt.Columns.Add( Field.FieldAlias, dc.DataType, dc.Expression );
}
else
{
dt.Columns.Add( Field.FieldAlias, dc.DataType );
}
}
if ( ds != null )
{
ds.Tables.Add( dt );
}
return dt;
}
}
20 / 48
?精品文档?
private void
InsertGroupByInto(DataTable destTable, DataTable sourceTable, string fieldList,
string rowFilter, string groupBy)
{
if ( fieldList == null || fieldList.Length == 0 )
{
return;
}
ParseGroupByFieldList( fieldList );
ParseFieldList( groupBy, false );
DataRow[] rows =
sourceTable.Select( rowFilter, groupBy );
DataRow lastSourceRow = null, destRow = null;
bool sameRow;
int rowCount = 0;
foreach ( DataRow sourceRow in rows )
21 / 48
?精品文档?
{
sameRow = false;
if ( lastSourceRow != null )
{
sameRow = true;
foreach ( FieldInfo Field in m_FieldInfo )
{
if ( !ColumnEqual( lastSourceRow[ Field.FieldName ], sourceRow[ Field.FieldName ] ) )
{
sameRow = false;
break;
}
}
if ( !sameRow )
{
22 / 48
?精品文档?
destTable.Rows.Add( destRow );
}
}
if ( !sameRow )
{
destRow = destTable.NewRow();
rowCount = 0;
}
rowCount += 1;
foreach ( FieldInfo field in GroupByFieldInfo )
{
switch ( field.Aggregate.ToLower() )
{
case null:
case ““:
case “last”:
destRow[ field.FieldAlias ] = sourceRow[ field.FieldName ];
23 / 48
?精品文档?
break;
case “first”:
if ( rowCount == 1 )
{
destRow[ field.FieldAlias ] =
sourceRow[ field.FieldName ];
}
break;
case “count”:
destRow[ field.FieldAlias ] = rowCount;
break;
case “sum”:
24 / 48
?精品文档?
destRow[ field.FieldAlias ] =
Add( destRow[ field.FieldAlias ],
sourceRow[ field.FieldName ] );
break;
case “max”:
destRow[ field.FieldAlias ] =
Max( destRow[ field.FieldAlias ],
sourceRow[ field.FieldName ] );
break;
case “min”:
if ( rowCount == 1 )
{
destRow[ field.FieldAlias ] =
sourceRow[ field.FieldName ];
}
25 / 48
?精品文档?
else
{
destRow[ field.FieldAlias ] =
Min( destRow[ field.FieldAlias ],
sourceRow[ field.FieldName ] );
}
break;
}
}
lastSourceRow = sourceRow;
}
if ( destRow != null )
{
destTable.Rows.Add( destRow );
}
}
private object Min(object a, object b)
26 / 48
?精品文档?
{
if ( ( a is DBNull ) || ( b is
DBNull ) )
{
return DBNull.Value;
}
if ( ( (IComparable) a ).CompareTo( b ) == -1 )
{
return a;
}
else
{
return b;
}
}
private object Max(object a, object b)
{
if ( a is DBNull )
{
return b;
}
27 / 48
?精品文档?
if ( b is DBNull )
{
return a;
}
if ( ( (IComparable) a ).CompareTo( b ) == 1 )
{
return a;
}
else
{
return b;
}
}
private object Add(object a, object b)
{
if ( a is DBNull )
{
return b;
}
if ( b is DBNull )
{
28 / 48
?精品文档?
return a;
}
return ( (decimal) a + (decimal) b );
}
private DataTable
CreateJoinTable(string tableName, DataTable sourceTable, string fieldList)
{
if ( fieldList == null )
{
return
sourceTable.Clone();
}
else
{
DataTable dt = new DataTable( tableName );
ParseFieldList( fieldList, true );
foreach ( FieldInfo field in m_FieldInfo )
29 / 48
?精品文档?
{
if ( field.RelationName == null )
{
DataColumn dc = sourceTable.Columns[ field.FieldName ];
dt.Columns.Add( dc.ColumnName, dc.DataType, dc.Expression );
}
else
{
DataColumn dc =
sourceTable.ParentRelations[ field.RelationName ].Parent
Table.Columns[ field.FieldName ];
dt.Columns.Add( dc.ColumnName, dc.DataType, dc.Expression );
}
}
if ( ds != null )
30 / 48
?精品文档?
{
ds.Tables.Add( dt );
}
return dt;
}
}
private void InsertJoinInto(DataTable destTable, DataTable sourceTable,
string fieldList, string rowFilter, string sort)
{
if ( fieldList == null )
{
return;
}
else
{
ParseFieldList( fieldList, true );
DataRow[] Rows = sourceTable.Select( rowFilter, sort );
31 / 48
?精品文档?
foreach ( DataRow SourceRow in Rows )
{
DataRow DestRow = destTable.NewRow();
foreach ( FieldInfo Field in m_FieldInfo )
{
if ( Field.RelationName == null )
{
DestRow[ Field.FieldName ] =
SourceRow[ Field.FieldName ];
}
else
{
DataRow ParentRow =
SourceRow.GetParentRow( Field.RelationName );
DestRow[ Field.FieldName ] =
32 / 48
?精品文档?
ParentRow[ Field.FieldName ];
}
}
destTable.Rows.Add( DestRow );
}
}
}
#endregion
#region SelectDistinct / Distinct
/// <summary
/// 按照fieldName从sourceTable中选
择出不重复的行,
/// 相当于select distinct fieldName from sourceTable
/// </summary
/// <param name=“tableName”表名
</param
/// <param name=“sourceTable”源
DataTable</param
/// <param name=“fieldName”列名
</param
33 / 48
?精品文档?
/// <returns一个新的不含重复行的
DataTable,列只包括fieldName指明的列</returns
public DataTable SelectDistinct(string tableName, DataTable sourceTable, string fieldName)
{
DataTable dt = new DataTable( tableName );
dt.Columns.Add( fieldName, sourceTable.Columns[ fieldName ].DataType );
object lastValue = null;
foreach ( DataRow dr in sourceTable.Select( ““, fieldName ) )
{
if ( lastValue == null || !( ColumnEqual( lastValue, dr[ fieldName ] ) ) )
{
lastValue = dr[ fieldName ];
dt.Rows.Add( new object[]{lastValue} );
}
}
34 / 48
?精品文档?
if ( ds != null && !ds.Tables.Contains( tableName ) )
{
ds.Tables.Add( dt );
}
return dt;
}
/// <summary
/// 按照fieldName从sourceTable中选
择出不重复的行,
/// 相当于select distinct fieldName1,fieldName2,,fieldNamen from sourceTable
/// </summary
/// <param name=“tableName”表名
</param
/// <param name=“sourceTable”源
DataTable</param
/// <param name=“fieldNames”列名数
组</param
/// <returns一个新的不含重复行的
DataTable,列只包括fieldNames中指明的列</returns
public DataTable SelectDistinct(string
35 / 48
?精品文档?
tableName, DataTable sourceTable, string[] fieldNames)
{
DataTable dt = new DataTable( tableName );
object[] values = new object[fieldNames.Length];
string fields = ““;
for ( int i = 0; i < fieldNames.Length; i++ )
{
dt.Columns.Add( fieldNames[ i ],
sourceTable.Columns[ fieldNames[ i ] ].DataType );
fields += fieldNames[ i ] + “,”;
}
fields =
fields.Remove( fields.Length - 1, 1 );
DataRow lastRow = null;
foreach ( DataRow dr in sourceTable.Select( ““, fields ) )
{
36 / 48
?精品文档?
if ( lastRow == null || !( RowEqual( lastRow, dr, dt.Columns ) ) )
{
lastRow = dr;
for ( int i = 0; i < fieldNames.Length; i++ )
{
values[ i ] = dr[ fieldNames[ i ] ];
}
dt.Rows.Add( values );
}
}
if ( ds != null
&& !ds.Tables.Contains( tableName ) )
{
ds.Tables.Add( dt );
}
return dt;
}
/// <summary
37 / 48
?精品文档?
/// 按照fieldName从sourceTable中选
择出不重复的行,
/// 并且包含sourceTable中所有的列。
/// </summary
/// <param name=“tableName”表名
</param
/// <param name=“sourceTable”源表
</param
/// <param name=“fieldName”字段
</param
/// <returns一个新的不含重复行的
DataTable</returns
public DataTable Distinct(string tableName, DataTable sourceTable, string fieldName)
{
DataTable dt = sourceTable.Clone();
dt.TableName = tableName;
object lastValue = null;
foreach ( DataRow dr in sourceTable.Select( ““, fieldName ) )
{
38 / 48
?精品文档?
if ( lastValue == null || !( ColumnEqual( lastValue, dr[ fieldName ] ) ) )
{
lastValue = dr[ fieldName ];
dt.Rows.Add( dr.ItemArray );
}
}
if ( ds != null && !ds.Tables.Contains( tableName ) )
{
ds.Tables.Add( dt );
}
return dt;
}
/// <summary
/// 按照fieldNames从sourceTable中选
择出不重复的行,
/// 并且包含sourceTable中所有的列。
/// </summary
/// <param name=“tableName”表名
39 / 48
?精品文档?
</param
/// <param name=“sourceTable”源表
</param
/// <param name=“fieldNames”字段
</param
/// <returns一个新的不含重复行的
DataTable</returns
public DataTable Distinct(string tableName, DataTable sourceTable, string[] fieldNames)
{
DataTable dt =
sourceTable.Clone();
dt.TableName = tableName;
string fields = ““;
for ( int i = 0; i < fieldNames.Length; i++ )
{
fields += fieldNames[ i ] + “,”;
}
fields =
fields.Remove( fields.Length - 1, 1 );
40 / 48
?精品文档?
DataRow lastRow = null;
foreach ( DataRow dr in sourceTable.Select( ““, fields ) )
{
if ( lastRow == null || !( RowEqual( lastRow, dr, dt.Columns ) ) )
{
lastRow = dr;
dt.Rows.Add( dr.ItemArray );
}
}
if ( ds != null && !ds.Tables.Contains( tableName ) )
{
ds.Tables.Add( dt );
}
return dt;
}
#endregion
#region Select Table Into
/// <summary
41 / 48
?精品文档?
/// 按sort排序,按rowFilter过滤
sourceTable,
/// 复制fieldList中指明的字段的数据到
新DataTable,并返回之
/// </summary
/// <param name=“tableName”表名
</param
/// <param name=“sourceTable”源表
</param
/// <param name=“fieldList”字段列表
</param
/// <param name=“rowFilter”过滤条件
</param
/// <param name=“sort”排序</param
/// <returns新DataTable</returns
public DataTable SelectInto(string tableName, DataTable sourceTable,
string fieldList, string rowFilter, string sort)
{
DataTable dt = CreateTable( tableName, sourceTable, fieldList );
42 / 48
?精品文档?
InsertInto( dt, sourceTable, fieldList, rowFilter, sort );
return dt;
}
#endregion
#region Group By Table
public DataTable
SelectGroupByInto(string tableName, DataTable sourceTable, string fieldList,
string rowFilter, string groupBy)
{
DataTable dt =
CreateGroupByTable( tableName, sourceTable, fieldList );
InsertGroupByInto( dt, sourceTable, fieldList, rowFilter, groupBy );
return dt;
}
#endregion
#region Join Tables
public DataTable SelectJoinInto(string
43 / 48
?精品文档?
tableName, DataTable sourceTable, string fieldList, string rowFilter, string sort)
{
DataTable dt =
CreateJoinTable( tableName, sourceTable, fieldList );
InsertJoinInto( dt, sourceTable, fieldList, rowFilter, sort );
return dt;
}
#endregion
#region Create Table
public DataTable CreateTable(string tableName, string fieldList)
{
DataTable dt = new DataTable( tableName );
DataColumn dc;
string[] Fields =
fieldList.Split( ‘,’ );
string[] FieldsParts;
string Expression;
foreach ( string Field in Fields )
44 / 48
?精品文档?
{
FieldsParts = Field.Trim().Split( “ “.ToCharArray(), 3 ); // allow for spaces in the expression
// add fieldname and datatype
if ( FieldsParts.Length == 2 )
{
dc = dt.Columns.Add( FieldsParts[ 0 ].Trim(),
Type.GetType( “System.” + FieldsParts[ 1 ].Trim(), true, true ) );
dc.AllowDBNull = true;
}
else if
( FieldsParts.Length == 3 ) // add fieldname, datatype, and expression
{
Expression = FieldsParts[ 2 ].Trim();
45 / 48
?精品文档?
if ( Expression.ToUpper() == “REQUIRED” )
{
dc = dt.Columns.Add( FieldsParts[ 0 ].Trim(), Type.GetType( “System.” + FieldsParts[ 1 ].Trim(), true, true ) );
dc.AllowDBNull = false;
}
else
{
dc = dt.Columns.Add( FieldsParts[ 0 ].Trim(), Type.GetType( “System.” + FieldsParts[ 1 ].Trim(), true, true ), Expression );
}
}
else
{
return null;
}
46 / 48
?精品文档?
}
if ( ds != null )
{
ds.Tables.Add( dt );
}
return dt;
}
public DataTable CreateTable(string tableName, string fieldList, string keyFieldList)
{
DataTable dt =
CreateTable( tableName, fieldList );
string[] KeyFields = keyFieldList.Split( ‘,’ );
if ( KeyFields.Length 0 )
{
DataColumn[] KeyFieldColumns = new DataColumn[KeyFields.Length];
int i;
for ( i = 1; i == KeyFields.Length - 1; ++i )
{
47 / 48
?精品文档?
KeyFieldColumns[ i ] = dt.Columns[ KeyFields[ i ].Trim() ];
}
dt.PrimaryKey =
KeyFieldColumns;
}
return dt;
}
#endregion
}
}
希望本文所述对大家asp.net程序设计有所帮助。
48 / 48
本文档为【asp.net DataTable相关操作集锦(筛选,取前N条数据,去重复行,获取指定列数据等)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。