using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Reflection; namespace Masuit.Tools.Core.Database { /// /// DataTable帮助类 /// public static class DataTableHelper { /// /// 给DataTable增加一个自增列 /// 如果DataTable 存在 identityid 字段 则 直接返回DataTable 不做任何处理 /// /// DataTable /// 返回Datatable 增加字段 identityid /// The collection already has a column with the specified name. (The comparison is not case-sensitive.) public static DataTable AddIdentityColumn(this DataTable dt) { if (!dt.Columns.Contains("identityid")) { dt.Columns.Add("identityid"); for (int i = 0; i < dt.Rows.Count; i++) { dt.Rows[i]["identityid"] = (i + 1).ToString(); } } return dt; } /// /// 检查DataTable 是否有数据行 /// /// DataTable /// 是否有数据行 public static bool HasRows(this DataTable dt) { return dt.Rows.Count > 0; } /// /// DataTable转换成实体列表 /// /// 实体 T /// datatable /// 强类型的数据集合 public static IList DataTableToList(this DataTable table) where T : class { if (!HasRows(table)) { return new List(); } IList list = new List(); foreach (DataRow dr in table.Rows) { var model = Activator.CreateInstance(); foreach (DataColumn dc in dr.Table.Columns) { object drValue = dr[dc.ColumnName]; PropertyInfo pi = model.GetType().GetProperty(dc.ColumnName); if (pi != null && pi.CanWrite && (drValue != null && !Convert.IsDBNull(drValue))) { pi.SetValue(model, drValue, null); } } list.Add(model); } return list; } /// /// 实体列表转换成DataTable /// /// 实体 /// 实体列表 /// 映射为数据表 /// The array is multidimensional and contains more than elements. public static DataTable ListToDataTable(this IList list) where T : class { if (list == null || list.Count <= 0) { return null; } var dt = new DataTable(typeof(T).Name); PropertyInfo[] myPropertyInfo = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); int length = myPropertyInfo.Length; bool createColumn = true; foreach (T t in list) { if (t == null) { continue; } var row = dt.NewRow(); for (int i = 0; i < length; i++) { PropertyInfo pi = myPropertyInfo[i]; string name = pi.Name; if (createColumn) { var column = new DataColumn(name, pi.PropertyType); dt.Columns.Add(column); } row[name] = pi.GetValue(t, null); } if (createColumn) { createColumn = false; } dt.Rows.Add(row); } return dt; } /// /// 将泛型集合类转换成DataTable /// /// 集合项类型 /// 集合 /// 数据集(表) public static DataTable ToDataTable(this IList list) { return ToDataTable(list, null); } /// /// 将泛型集合类转换成DataTable /// /// 集合项类型 /// 集合 /// 需要返回的列的列名 /// 数据集(表) public static DataTable ToDataTable(this IList list, params string[] propertyName) { List propertyNameList = new List(); if (propertyName != null) { propertyNameList.AddRange(propertyName); } DataTable result = new DataTable(); if (list.Count <= 0) { return result; } PropertyInfo[] propertys = list[0].GetType().GetProperties(); propertys.ForEach(pi => { if (propertyNameList.Count == 0) { result.Columns.Add(pi.Name, pi.PropertyType); } else { if (propertyNameList.Contains(pi.Name)) { result.Columns.Add(pi.Name, pi.PropertyType); } } }); list.ForEach(item => { ArrayList tempList = new ArrayList(); foreach (PropertyInfo pi in propertys) { if (propertyNameList.Count == 0) { object obj = pi.GetValue(item, null); tempList.Add(obj); } else { if (propertyNameList.Contains(pi.Name)) { object obj = pi.GetValue(item, null); tempList.Add(obj); } } } object[] array = tempList.ToArray(); result.LoadDataRow(array, true); }); return result; } /// /// 根据nameList里面的字段创建一个表格,返回该表格的DataTable /// /// 包含字段信息的列表 /// DataTable public static DataTable CreateTable(this List nameList) { if (nameList.Count <= 0) { return null; } var myDataTable = new DataTable(); foreach (string columnName in nameList) { myDataTable.Columns.Add(columnName, typeof(string)); } return myDataTable; } /// /// 通过字符列表创建表字段,字段格式可以是:
/// 1) a,b,c,d,e
/// 2) a|int,b|string,c|bool,d|decimal
///
/// /// 字符列表 /// 内存表 public static DataTable CreateTable(this DataTable dt, string nameString) { string[] nameArray = nameString.Split(',', ';'); foreach (string item in nameArray) { if (!string.IsNullOrEmpty(item)) { string[] subItems = item.Split('|'); if (subItems.Length == 2) { dt.Columns.Add(subItems[0], ConvertType(subItems[1])); } else { dt.Columns.Add(subItems[0]); } } } return dt; } /// /// 根据类型名返回一个Type类型 /// /// 类型的名称 /// Type对象 private static Type ConvertType(string typeName) { typeName = typeName.ToLower().Replace("system.", ""); Type newType = typeof(string); switch (typeName) { case "boolean": case "bool": newType = typeof(bool); break; case "int16": case "short": newType = typeof(short); break; case "int32": case "int": newType = typeof(int); break; case "long": case "int64": newType = typeof(long); break; case "uint16": case "ushort": newType = typeof(ushort); break; case "uint32": case "uint": newType = typeof(uint); break; case "uint64": case "ulong": newType = typeof(ulong); break; case "single": case "float": newType = typeof(float); break; case "string": newType = typeof(string); break; case "guid": newType = typeof(Guid); break; case "decimal": newType = typeof(decimal); break; case "double": newType = typeof(double); break; case "datetime": newType = typeof(DateTime); break; case "byte": newType = typeof(byte); break; case "char": newType = typeof(char); break; } return newType; } /// /// 获得从DataRowCollection转换成的DataRow数组 /// /// DataRowCollection /// DataRow数组 public static DataRow[] GetDataRowArray(this DataRowCollection drc) { int count = drc.Count; DataRow[] drs = new DataRow[count]; for (int i = 0; i < count; i++) { drs[i] = drc[i]; } return drs; } /// /// 将DataRow数组转换成DataTable,注意行数组的每个元素须具有相同的数据结构, /// 否则当有元素长度大于第一个元素时,抛出异常 /// /// 行数组 /// 将内存行组装成内存表 public static DataTable GetTableFromRows(this DataRow[] rows) { if (rows.Length <= 0) { return new DataTable(); } DataTable dt = rows[0].Table.Clone(); dt.DefaultView.Sort = rows[0].Table.DefaultView.Sort; for (int i = 0; i < rows.Length; i++) { dt.LoadDataRow(rows[i].ItemArray, true); } return dt; } /// /// 排序表的视图 /// /// 原内存表 /// 排序方式 /// 排序后的内存表 public static DataTable SortedTable(this DataTable dt, params string[] sorts) { if (dt.Rows.Count > 0) { string tmp = ""; foreach (var t in sorts) { tmp += t + ","; } dt.DefaultView.Sort = tmp.TrimEnd(','); } return dt; } /// /// 根据条件过滤表的内容 /// /// 原内存表 /// 过滤条件 /// 过滤后的内存表 public static DataTable FilterDataTable(this DataTable dt, string condition) { if (condition.Trim().Length == 0) { return dt; } var newdt = dt.Clone(); DataRow[] dr = dt.Select(condition); dr.ForEach(t => newdt.ImportRow(t)); return newdt; } } }