using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Reflection; namespace Masuit.Tools.Core.Database { /// /// DataTable帮助类 /// public static class DataTableHelper { /// /// 给DataTable增加一个自增列 /// 如果DataTable 存在 identityid 字段 则 直接返回DataTable 不做任何处理 /// /// DataTable /// 返回Datatable 增加字段 identityid 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转List /// /// /// /// public static List ToList(this DataTable dt) where T : class, new() { List list = new List(); using (dt) { if (dt == null || dt.Rows.Count == 0) { return list; } DataTableBuilder eblist = DataTableBuilder.CreateBuilder(dt.Rows[0]); foreach (DataRow info in dt.Rows) { list.Add(eblist.Build(info)); } return list; } } /// /// 将泛型集合类转换成DataTable /// /// 集合项类型 /// 集合 /// 表名 /// 数据集(表) public static DataTable ToDataTable(this IEnumerable list, string tableName = null) { return ToDataTable(list.ToList(), tableName); } /// /// 将泛型集合类转换成DataTable /// /// 集合项类型 /// 集合 /// 表名 /// 数据集(表) public static DataTable ToDataTable(this IList list, string tableName = null) { DataTable result = new DataTable(tableName); if (list.Count <= 0) { return result; } var properties = list[0].GetType().GetProperties(); result.Columns.AddRange(properties.Select(p => new DataColumn(p.GetCustomAttribute()?.Description ?? p.Name, p.PropertyType)).ToArray()); list.ForEach(item => result.LoadDataRow(properties.Select(p => p.GetValue(item)).ToArray(), 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; var 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; foreach (var t in rows) { dt.LoadDataRow(t.ItemArray, true); } return dt; } } }