using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Linq; using System.Reflection; namespace Masuit.Tools.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() { var list = new List(); if (dt == null || dt.Rows.Count == 0) { return list; } list.AddRange(dt.Rows.Cast().Select(info => DataTableBuilder.CreateBuilder(dt.Rows[0]).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) { var 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)) { continue; } 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.ToLower().Replace("system.", "") switch { "boolean" => typeof(bool), "bool" => typeof(bool), "int16" => typeof(short), "short" => typeof(short), "int32" => typeof(int), "int" => typeof(int), "long" => typeof(long), "int64" => typeof(long), "uint16" => typeof(ushort), "ushort" => typeof(ushort), "uint32" => typeof(uint), "uint" => typeof(uint), "uint64" => typeof(ulong), "ulong" => typeof(ulong), "single" => typeof(float), "float" => typeof(float), "string" => typeof(string), "guid" => typeof(Guid), "decimal" => typeof(decimal), "double" => typeof(double), "datetime" => typeof(DateTime), "byte" => typeof(byte), "char" => typeof(char), _ => typeof(string) }; /// /// 获得从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(); } var 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; } } }