C#DataTable帮助类DataTableHelper

/// <summary>
/// DataTable帮助类
/// </summary>
public class DataTableHelper
{
/// <summary>
/// dataTable赋值给另一个DataTable
/// 注意rows是否对应,否则就会修改成错误数据
/// </summary>
/// <param name="table">需要赋值的table</param>
/// <param name="dt">赋值的Source Datable</param>
/// <returns>赋值成功后的datable</returns>
public static DataTable DataTableMapper(DataTable table, DataTable dt)
{
try
{
var col = "";
for (int i = 0; i < table.Columns.Count; i++)
{
for (int j = 0; j < dt.Columns.Count; j++)
{
if (table.Columns[i].ColumnName == dt.Columns[j].ColumnName)
{
if (string.IsNullOrEmpty(col))
{
col = table.Columns[i].ColumnName;
}
else
{
col += "," + table.Columns[i].ColumnName;
}
}
}
}

for (int i = 0; i < table.Rows.Count; i++)
{
for (int j = 0; j < dt.Rows.Count; j++)
{
foreach (var item in col.Split(','))
{
table.Rows[i][item] = dt.Rows[j][item];
}
}
}
}
catch (Exception e)
{

throw new Exception(e.Message);
}

return table;
}
/// <summary>
/// DataTable转SQL字符串的功能,一般用在UPDATE,DELETE,INSERT中,使用该方法前一定要给DataTable命名,这样才能确定操作的表
/// 若使用UPDATE模式则在生成sql前判断行是否被修改,修改了才生成sql
/// 如果SQLMode操作模式选择UPDATE,DELETE时,将以第一列作为WHERE查询条件,如果传入条件语句,则以传入条件为准
/// 如果操作模式选择ISNERT,则不要将自增列放进dataTable
/// </summary>
/// <param name="dataTable"></param>
/// <param name="tpye">SQL操作模式,只设置3种,UPDATE,DELETE,INSERT(enum DataTableToSQLType)</param>
/// <param name="SQLWhere">条件语句,默认为空,如果不为空,则如:id=1 and name='张三'</param>
/// <returns></returns>
public static string DataTableToSQL(DataTable dataTable, DataTableToSQLType tpye, string SQLWhere = null)
{
if (dataTable.TableName == "" || dataTable.TableName == null)
{
return "";
}

StringBuilder sb = new StringBuilder();
int i = 0;
int j = 0;
if (tpye == DataTableToSQLType.INSERT)
{
for (i = 0; i < dataTable.Rows.Count; i++)
{
sb.AppendFormat("INSERT INTO {0}(", dataTable.TableName);

//拼前半段INSERT
for (j = 0; j < dataTable.Columns.Count; j++)
{
if (j == dataTable.Columns.Count - 1)
{
sb.AppendFormat("{0})", dataTable.Columns[j].Caption);
}
else
{
sb.AppendFormat("{0},", dataTable.Columns[j].Caption);
}
}
//拼后半段VALUES
sb.Append(" VALUES(");
for (j = 0; j < dataTable.Columns.Count; j++)
{
if (j == dataTable.Columns.Count - 1)
{
sb.AppendFormat("'{0}')", dataTable.Rows[i][j]);
}
else
{
sb.AppendFormat("'{0}',", dataTable.Rows[i][j]);
}
}
sb.AppendLine();
}
}
else if (tpye == DataTableToSQLType.UPDATE)
{
for (i = 0; i < dataTable.Rows.Count; i++)
{
//判断行是否被修改,修改才生成sql
if (dataTable.Rows[i].RowState == DataRowState.Modified)
{
sb.AppendFormat("UPDATE {0} SET ", dataTable.TableName);
for (j = 1; j < dataTable.Columns.Count; j++)
{
if (j == dataTable.Columns.Count - 1)
{
sb.AppendFormat(" {0}='{1}'", dataTable.Columns[j].Caption, dataTable.Rows[i][j]);
}
else
{
sb.AppendFormat(" {0}='{1}',", dataTable.Columns[j].Caption, dataTable.Rows[i][j]);
}
}
if (!string.IsNullOrEmpty(SQLWhere))
sb.AppendFormat(" WHERE ", SQLWhere);
else
sb.AppendFormat(" WHERE {0}='{1}'", dataTable.Columns[0].Caption, dataTable.Rows[i][0]);
sb.AppendLine();
}
}
}
else if (tpye == DataTableToSQLType.DELETE)
{
//判断用户是否录入自定义条件
if (!string.IsNullOrEmpty(SQLWhere))
sb.AppendFormat("DELETE {0} WHERE {1} ", dataTable.TableName, SQLWhere);
else
{
sb.AppendFormat("DELETE {0} WHERE {1} IN (", dataTable.TableName, dataTable.Columns[0].Caption);
for (i = 0; i < dataTable.Rows.Count; i++)
{

if (i < dataTable.Rows.Count - 1)
{
sb.AppendFormat("'{0}',", dataTable.Rows[i][0]);
}
else
{
sb.AppendFormat("'{0}')", dataTable.Rows[i][0]);
}
}
}

}
return sb.ToString();
}
/// <summary>
/// 给DataTable增加一个主键列(自动生成guid)
/// 如果DataTable 存在 id 字段 则 直接返回DataTable 不做任何处理
/// </summary>
/// <param name="dt">DataTable</param>
/// <returns>返回Datatable 增加字段 主键id </returns>
public static DataTable AddColumnIdentityId(DataTable dt)
{
if (!dt.Columns.Contains("id"))
{
dt.Columns.Add("id");
for (int i = 0; i < dt.Rows.Count; i++)
{
dt.Rows[i]["id"] = Guid.NewGuid().ToString("N");
}
}
return dt;
}
/// <summary>
/// 在新增的时候通用新增方法
/// </summary>
/// <param name="dt">datable</param>
/// <param name="tentanId">租户id</param>
/// <param name="empCode">用户code</param>
/// <param name="empName">用户名称</param>
/// <returns></returns>
public static DataTable AddColumnIdentityId(DataTable dt, int tentanId, string empCode, string empName)
{
var time = DateTime.Now.ToCstTime();
if (IsHaveRows(dt))
{
if (dt.Columns.Contains("id"))
dt.Columns.Add("id");
if (dt.Columns.Contains("create_time"))
dt.Columns.Add("create_time");
if (dt.Columns.Contains("create_emp_code"))
dt.Columns.Add("create_emp_code");
if (dt.Columns.Contains("create_emp_name"))
dt.Columns.Add("create_emp_name");
if (dt.Columns.Contains("update_time"))
dt.Columns.Add("update_time");
if (dt.Columns.Contains("update_emp_code"))
dt.Columns.Add("update_emp_code");
if (dt.Columns.Contains("update_emp_name"))
dt.Columns.Add("update_emp_name");
if (dt.Columns.Contains("tenant_id"))
dt.Columns.Add("tenant_id");
if (dt.Columns.Contains("deleted"))
dt.Columns.Add("deleted");
for (int i = 0; i < dt.Rows.Count; i++)
{
dt.Rows[i]["id"] = Guid.NewGuid().ToString("N");
dt.Rows[i]["create_time"] = time;
dt.Rows[i]["create_emp_code"] = empCode;
dt.Rows[i]["create_emp_name"] = empName;
dt.Rows[i]["update_time"] = time;
dt.Rows[i]["update_emp_code"] = empCode;
dt.Rows[i]["update_emp_name"] = empName;
dt.Rows[i]["tenant_id"] = tentanId;
dt.Rows[i]["deleted"] = "0";
}
}

return dt;
}
/// <summary>
/// 在修改的时候通用修改方法
/// </summary>
/// <param name="dt">datable</param>
/// <param name="empCode">用户code</param>
/// <param name="empName">用户名称</param>
/// <returns></returns>
public static DataTable UpdateDataTableColumn(DataTable dt, string empCode, string empName)
{
var time = DateTime.Now.ToCstTime();
if (dt.Columns.Contains("update_time"))
dt.Columns.Add("update_time");
if (dt.Columns.Contains("update_emp_code"))
dt.Columns.Add("update_emp_code");
if (dt.Columns.Contains("update_emp_name"))
dt.Columns.Add("update_emp_name");
if (IsHaveRows(dt))
{
for (int i = 0; i < dt.Rows.Count; i++)
{
dt.Rows[i]["update_time"] = time;
dt.Rows[i]["update_emp_code"] = empCode;
dt.Rows[i]["update_emp_name"] = empName;
}
}

return dt;
}

/// <summary>
/// 检查DataTable 是否有数据行
/// </summary>
/// <param name="dt">DataTable</param>
/// <returns></returns>
public static bool IsHaveRows(DataTable dt)
{
if (dt != null && dt.Rows.Count > 0)
return true;

return false;
}

/// <summary>
/// DataTable转换成实体列表
/// </summary>
/// <typeparam name="T">实体 T </typeparam>
/// <param name="table">datatable</param>
/// <returns></returns>
public static IList<T> DataTableToList<T>(DataTable table)
where T : class
{
if (!IsHaveRows(table))
return new List<T>();

IList<T> list = new List<T>();
T model = default(T);
foreach (DataRow dr in table.Rows)
{
model = Activator.CreateInstance<T>();

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;
}


/// <summary>
/// 实体列表转换成DataTable
/// </summary>
/// <typeparam name="T">实体</typeparam>
/// <param name="list"> 实体列表</param>
/// <returns></returns>
public static DataTable ListToDataTable<T>(IList<T> list)
where T : class
{
if (list == null || list.Count <= 0)
{
return null;
}
DataTable dt = new DataTable(typeof(T).Name);
DataColumn column;
DataRow row;

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;
}

row = dt.NewRow();
for (int i = 0; i < length; i++)
{
PropertyInfo pi = myPropertyInfo[i];
string name = pi.Name;
if (createColumn)
{
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;

}


/// <summary>
/// 将泛型集合类转换成DataTable
/// </summary>
/// <typeparam name="T">集合项类型</typeparam>
/// <param name="list">集合</param>
/// <returns>数据集(表)</returns>
public static DataTable ToDataTable<T>(IList<T> list)
{
return ToDataTable<T>(list, null);
}

/// <summary>
/// 将泛型集合类转换成DataTable
/// </summary>
/// <typeparam name="T">集合项类型</typeparam>
/// <param name="list">集合</param>
/// <param name="propertyName">需要返回的列的列名</param>
/// <returns>数据集(表)</returns>
public static DataTable ToDataTable<T>(IList<T> list, params string[] propertyName)
{
List<string> propertyNameList = new List<string>();
if (propertyName != null)
propertyNameList.AddRange(propertyName);

DataTable result = new DataTable();
if (list.Count > 0)
{
PropertyInfo[] propertys = list[0].GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
if (propertyNameList.Count == 0)
{
result.Columns.Add(pi.Name, pi.PropertyType);
}
else
{
if (propertyNameList.Contains(pi.Name))
{
result.Columns.Add(pi.Name, pi.PropertyType);
}
}
}

for (int i = 0; i < list.Count; i++)
{
ArrayList tempList = new ArrayList();
foreach (PropertyInfo pi in propertys)
{
if (propertyNameList.Count == 0)
{
object obj = pi.GetValue(list[i], null);
tempList.Add(obj);
}
else
{
if (propertyNameList.Contains(pi.Name))
{
object obj = pi.GetValue(list[i], null);
tempList.Add(obj);
}
}
}
object[] array = tempList.ToArray();
result.LoadDataRow(array, true);
}
}
return result;
}


/// <summary>
/// 根据nameList里面的字段创建一个表格,返回该表格的DataTable
/// </summary>
/// <param name="nameList">包含字段信息的列表</param>
/// <returns>DataTable</returns>
public static DataTable CreateTable(List<string> nameList)
{
if (nameList.Count <= 0)
return null;

DataTable myDataTable = new DataTable();
foreach (string columnName in nameList)
{
myDataTable.Columns.Add(columnName, typeof(string));
}
return myDataTable;
}

/// <summary>
/// 通过字符列表创建表字段,字段格式可以是:
/// 1) a,b,c,d,e
/// 2) a|int,b|string,c|bool,d|decimal
/// </summary>
/// <param name="nameString"></param>
/// <returns></returns>
public static DataTable CreateTable(string nameString)
{
string[] nameArray = nameString.Split(new char[] { ',', ';' });
List<string> nameList = new List<string>();
DataTable dt = new DataTable();
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;
}

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;
}

/// <summary>
/// 获得从DataRowCollection转换成的DataRow数组
/// </summary>
/// <param name="drc">DataRowCollection</param>
/// <returns></returns>
public static DataRow[] GetDataRowArray(DataRowCollection drc)
{
int count = drc.Count;
DataRow[] drs = new DataRow[count];
for (int i = 0; i < count; i++)
{
drs[i] = drc[i];
}
return drs;
}

/// <summary>
/// 将DataRow数组转换成DataTable,注意行数组的每个元素须具有相同的数据结构,
/// 否则当有元素长度大于第一个元素时,抛出异常
/// </summary>
/// <param name="rows">行数组</param>
/// <returns></returns>
public static DataTable GetTableFromRows(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;
}

/// <summary>
/// 排序表的视图
/// </summary>
/// <param name="dt"></param>
/// <param name="sorts"></param>
/// <returns></returns>
public static DataTable SortedTable(DataTable dt, params string[] sorts)
{
if (dt.Rows.Count > 0)
{
string tmp = "";
for (int i = 0; i < sorts.Length; i++)
{
tmp += sorts[i] + ",";
}
dt.DefaultView.Sort = tmp.TrimEnd(',');
}
return dt;
}

/// <summary>
/// 根据条件过滤表的内容
/// </summary>
/// <param name="dt"></param>
/// <param name="condition"></param>
/// <returns></returns>
public static DataTable FilterDataTable(DataTable dt, string condition)
{
if (condition.Trim() == "")
{
return dt;
}
else
{
DataTable newdt = new DataTable();
newdt = dt.Clone();
DataRow[] dr = dt.Select(condition);
for (int i = 0; i < dr.Length; i++)
{
newdt.ImportRow((DataRow)dr[i]);
}
return newdt;
}
}

public enum DataTableToSQLType
{
INSERT,
UPDATE,
DELETE
}
}

posted @   龙丶谈笑风声  阅读(468)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示