Code
using System; 
using System.Collections; 
using System.Data; 
 
namespace Common 

    
/**//**//**//// <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; 
 
        
public DataSet DataSet 
        

            
get return ds; } 
        }
 
 
        ConstructionConstruction
Construction 
 
        Private MethodsPrivate Methods
Private Methods 
 
        SelectDistinct 
/ DistinctSelectDistinct / Distinct#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> 
        
/// <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} ); 
                }
 
            }
 
            
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 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 - 11 ); 
            DataRow lastRow 
= null
            
foreach ( DataRow dr in sourceTable.Select( "", fields ) ) 
            

                
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> 
        
/// 按照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 ) ) 
            

                
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">表名</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 - 11 ); 
            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
 
 
        Select Table IntoSelect Table Into
Select Table Into 
 
        Group By TableGroup By Table
Group By Table 
 
        Join TablesJoin Tables
Join Tables 
 
        Create TableCreate Table
Create Table 
    }
 
}

调用:
dt = dsHelper.SelectGroupByInto("OrderSummary", ds.Tables["Employees"],
    "EmployeeID,sum(Amount) Total,min(Amount) Min,max(Amount) Max", "EmployeeID<5", "EmployeeID");

此调用示例创建新 DataTable 具有四个字段 (EmployeeID、 总计、, Min 和 Max) 以及 OrderSummary TableName 。 这些四个字段具有相同数据类型, EmployeeID 和 Orders 表中数量字段。 然后本示例从 Orders DataTable , 读取记录并将记录写入 OrderSummary DataTable 。 OrderSummary DataTable 包含 EmployeeID 域和三个不同的聚合的金额字段上筛选, EmployeeID EmployeeID 5 和, 是上分组 (和按) < "。 如果 GroupBy 参数是空白, DataTable 目标包含聚合所有输入仅单个记录

Posted on 2010-09-05 18:05  水手2408  阅读(455)  评论(0编辑  收藏  举报