You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
461 lines
18 KiB
C#
461 lines
18 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Reflection;
|
|
using System.Text;
|
|
using HuizhongLibrary.Data;
|
|
using HuizhongLibrary.Log;
|
|
|
|
namespace HuizhongLibrary
|
|
{
|
|
/// <summary>
|
|
/// DataTable扩展
|
|
/// </summary>
|
|
public static class DataTableExtension
|
|
{
|
|
#region DataTable转List
|
|
/// <summary>
|
|
/// DataTable转List
|
|
/// </summary>
|
|
/// <param name="obj">扩展对象</param>
|
|
public static List<T> ToList<T>(this DataTable tb)
|
|
{
|
|
if (tb == null || tb.Rows.Count == 0) return null;
|
|
//获取对象所有属性
|
|
Type t = typeof(T);
|
|
List<T> ListModel = new List<T>();
|
|
|
|
PropertyInfo[] propertyInfo = t.GetProperties();
|
|
bool bk = false;
|
|
string json = "";
|
|
if (propertyInfo.Length > 0)
|
|
{
|
|
#region 全部是属性
|
|
for (int i = 0; i < tb.Rows.Count; i++)
|
|
{
|
|
//创建泛型对象
|
|
DataRow row = tb.Rows[i];
|
|
T model = Activator.CreateInstance<T>();
|
|
for (int j = 0; j < tb.Columns.Count; j++)
|
|
{
|
|
foreach (PropertyInfo info in propertyInfo)
|
|
{
|
|
//属性名称和列名相同时赋值
|
|
if (tb.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
|
|
{
|
|
bk = SetPropertyValue(model, info, row[j]);
|
|
if (bk == false)
|
|
{
|
|
json = row.ToJson();
|
|
ErrorFollow.TraceWrite("转换错误", "行信息", json);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ListModel.Add(model);
|
|
}
|
|
#endregion
|
|
}
|
|
else
|
|
{
|
|
#region 全部是字段
|
|
FieldInfo[] fieldinfo = t.GetFields();
|
|
for (int i = 0; i < tb.Rows.Count; i++)
|
|
{
|
|
//创建泛型对象
|
|
DataRow row = tb.Rows[i];
|
|
T model = Activator.CreateInstance<T>();
|
|
for (int j = 0; j < tb.Columns.Count; j++)
|
|
{
|
|
foreach (FieldInfo info in fieldinfo)
|
|
{
|
|
//属性名称和列名相同时赋值
|
|
if (tb.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
|
|
{
|
|
bk = SetFieldValue(model, info, row[j]);
|
|
if (bk == false)
|
|
{
|
|
json = row.ToJson();
|
|
ErrorFollow.TraceWrite("转换错误", "行信息", json);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ListModel.Add(model);
|
|
}
|
|
#endregion
|
|
}
|
|
return ListModel;
|
|
}
|
|
#endregion
|
|
#region 转换DataRow为Model
|
|
public static T ToModel<T>(this DataRow row)
|
|
{
|
|
//获取对象所有属性
|
|
DataTable tb = row.Table;
|
|
Type t = typeof(T);
|
|
T model = Activator.CreateInstance<T>();
|
|
PropertyInfo[] propertyInfo = t.GetProperties();
|
|
bool bk = false;
|
|
string json = "";
|
|
if (propertyInfo.Length > 0)
|
|
{
|
|
for (int j = 0; j < tb.Columns.Count; j++)
|
|
{
|
|
foreach (PropertyInfo info in propertyInfo)
|
|
{
|
|
//属性名称和列名相同时赋值
|
|
if (tb.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
|
|
{
|
|
bk=SetPropertyValue(model, info, row[j]);
|
|
if (bk == false)
|
|
{
|
|
json = row.ToJson();
|
|
ErrorFollow.TraceWrite("转换错误", "行信息", json);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
FieldInfo[] fieldinfo = t.GetFields();
|
|
for (int j = 0; j < tb.Columns.Count; j++)
|
|
{
|
|
foreach (FieldInfo info in fieldinfo)
|
|
{
|
|
//属性名称和列名相同时赋值
|
|
if (tb.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
|
|
{
|
|
bk=SetFieldValue(model, info, row[j]);
|
|
if (bk == false)
|
|
{
|
|
json = row.ToJson();
|
|
ErrorFollow.TraceWrite("转换错误", "行信息", json);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return model;
|
|
}
|
|
#endregion
|
|
#region 属性赋值
|
|
public static bool SetPropertyValue<T>(T model,PropertyInfo info,object value)
|
|
{
|
|
if (value == DBNull.Value || value == null)
|
|
{
|
|
info.SetValue(model, null, null);
|
|
return true;
|
|
}
|
|
if (info.PropertyType == typeof(byte[]))
|
|
{
|
|
info.SetValue(model, (byte[])value, null);
|
|
return true;
|
|
}
|
|
string val = Convert.ToString(value);
|
|
if (val == "")
|
|
{
|
|
if (info.PropertyType == typeof(string))
|
|
{
|
|
info.SetValue(model, Convert.ToString(val), null);
|
|
}
|
|
else
|
|
{
|
|
info.SetValue(model, null, null);
|
|
}
|
|
return true;
|
|
}
|
|
try
|
|
{
|
|
if (info.PropertyType == typeof(byte) || info.PropertyType == typeof(Nullable<byte>))
|
|
{
|
|
info.SetValue(model, Convert.ToByte(val), null);
|
|
}
|
|
else if (info.PropertyType == typeof(Int16) || info.PropertyType == typeof(Nullable<Int16>))
|
|
{
|
|
info.SetValue(model, Convert.ToInt16(val), null);
|
|
}
|
|
else if (info.PropertyType == typeof(int) || info.PropertyType == typeof(Nullable<int>))
|
|
{
|
|
info.SetValue(model, Convert.ToInt32(val), null);
|
|
}
|
|
else if (info.PropertyType == typeof(Int64) || info.PropertyType == typeof(Nullable<Int64>))
|
|
{
|
|
info.SetValue(model, Convert.ToInt64(val), null);
|
|
}
|
|
else if (info.PropertyType == typeof(bool) || info.PropertyType == typeof(Nullable<bool>))
|
|
{
|
|
if (val == "True" || val == "False")
|
|
{
|
|
info.SetValue(model, Convert.ToBoolean(val), null);
|
|
}
|
|
else
|
|
{
|
|
int valbool = Convert.ToInt32(val);
|
|
info.SetValue(model, Convert.ToBoolean(valbool), null);
|
|
}
|
|
}
|
|
else if (info.PropertyType == typeof(decimal) || info.PropertyType == typeof(Nullable<decimal>))
|
|
{
|
|
info.SetValue(model, Convert.ToDecimal(val), null);
|
|
}
|
|
else if (info.PropertyType == typeof(Double) || info.PropertyType == typeof(Nullable<Double>))
|
|
{
|
|
info.SetValue(model, Convert.ToDouble(val), null);
|
|
}
|
|
else if (info.PropertyType == typeof(Single) || info.PropertyType == typeof(Nullable<Single>))
|
|
{
|
|
info.SetValue(model, Convert.ToSingle(val), null);
|
|
}
|
|
else if (info.PropertyType == typeof(DateTime) || info.PropertyType == typeof(Nullable<DateTime>))
|
|
{
|
|
info.SetValue(model, Convert.ToDateTime(val), null);
|
|
}
|
|
else
|
|
{
|
|
info.SetValue(model, Convert.ToString(val), null);
|
|
}
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
string str = "列名="+ info.Name+",内容="+ val;
|
|
ErrorFollow.TraceWrite("数据格式转换错误", "", str);
|
|
ErrorFollow.TraceWrite(ex.TargetSite.Name,ex.StackTrace, ex.Message);
|
|
}
|
|
return false;
|
|
}
|
|
#endregion
|
|
#region 字段赋值
|
|
public static bool SetFieldValue<T>(T model, FieldInfo info, object value)
|
|
{
|
|
if (value == DBNull.Value || value == null)
|
|
{
|
|
info.SetValue(model, null);
|
|
return true;
|
|
}
|
|
if (info.FieldType == typeof(byte[]))
|
|
{
|
|
info.SetValue(model, (byte[])value);
|
|
return true;
|
|
}
|
|
string val = Convert.ToString(value);
|
|
if (val == "")
|
|
{
|
|
if (info.FieldType == typeof(string))
|
|
{
|
|
info.SetValue(model, Convert.ToString(val));
|
|
}
|
|
else
|
|
{
|
|
info.SetValue(model, null);
|
|
}
|
|
return true;
|
|
}
|
|
try
|
|
{
|
|
if (info.FieldType == typeof(byte) || info.FieldType == typeof(Nullable<byte>))
|
|
{
|
|
info.SetValue(model, Convert.ToByte(val));
|
|
}
|
|
else if (info.FieldType == typeof(Int16) || info.FieldType == typeof(Nullable<Int16>))
|
|
{
|
|
info.SetValue(model, Convert.ToInt16(val));
|
|
}
|
|
else if (info.FieldType == typeof(int) || info.FieldType == typeof(Nullable<int>))
|
|
{
|
|
info.SetValue(model, Convert.ToInt32(val));
|
|
}
|
|
else if (info.FieldType == typeof(Int64) || info.FieldType == typeof(Nullable<Int64>))
|
|
{
|
|
info.SetValue(model, Convert.ToInt64(val));
|
|
}
|
|
else if (info.FieldType == typeof(bool) || info.FieldType == typeof(Nullable<bool>))
|
|
{
|
|
if (val == "True" || val == "False")
|
|
{
|
|
info.SetValue(model, Convert.ToBoolean(val));
|
|
}
|
|
else
|
|
{
|
|
int valbool = Convert.ToInt32(val);
|
|
info.SetValue(model, Convert.ToBoolean(valbool));
|
|
}
|
|
}
|
|
else if (info.FieldType == typeof(decimal) || info.FieldType == typeof(Nullable<decimal>))
|
|
{
|
|
info.SetValue(model, Convert.ToDecimal(val));
|
|
}
|
|
else if (info.FieldType == typeof(Double) || info.FieldType == typeof(Nullable<Double>))
|
|
{
|
|
info.SetValue(model, Convert.ToDouble(val));
|
|
}
|
|
else if (info.FieldType == typeof(Single) || info.FieldType == typeof(Nullable<Single>))
|
|
{
|
|
info.SetValue(model, Convert.ToSingle(val));
|
|
}
|
|
else if (info.FieldType == typeof(DateTime) || info.FieldType == typeof(Nullable<DateTime>))
|
|
{
|
|
info.SetValue(model, Convert.ToDateTime(val));
|
|
}
|
|
else
|
|
{
|
|
info.SetValue(model, Convert.ToString(val));
|
|
}
|
|
return true;
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
string str = "列名=" + info.Name + ",内容=" + val;
|
|
ErrorFollow.TraceWrite("数据格式转换错误", "", str);
|
|
ErrorFollow.TraceWrite(ex.TargetSite.Name, ex.StackTrace, ex.Message);
|
|
}
|
|
return false;
|
|
}
|
|
#endregion
|
|
|
|
#region DataTable转Json
|
|
public static string ToJson(this DataTable tb)
|
|
{
|
|
if (tb.Rows.Count == 0) return "";
|
|
DateTime time = new DateTime(0x7b2, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
long DatetimeMinTimeTicks = time.Ticks;
|
|
string s = "[";
|
|
foreach (DataRow row in tb.Rows)
|
|
{
|
|
string a = "{";
|
|
foreach (DataColumn col in tb.Columns)
|
|
{
|
|
if (col.ExtendedProperties.Contains("NoJson") == true) continue;
|
|
if (row.IsNull(col.ColumnName) == true)
|
|
{
|
|
a += "\"" + col.ColumnName + "\":null,";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(string) || col.DataType == typeof(System.Guid))
|
|
{
|
|
string vvv = row[col.ColumnName].ToString();
|
|
vvv = vvv.Replace("\r\n", "\\r\\n").Replace("\n", "\\n");
|
|
a += "\"" + col.ColumnName + "\":\"" + vvv + "\",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(DateTime))
|
|
{
|
|
DateTime datetime = Convert.ToDateTime(row[col.ColumnName]);
|
|
a += "\"" + col.ColumnName + "\":\"\\/Date(" + (long)((datetime.ToUniversalTime().Ticks - DatetimeMinTimeTicks) / 0x2710) + ")\\/\",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(bool))
|
|
{
|
|
a += "\"" + col.ColumnName + "\":" + row[col.ColumnName].ToString().ToLower() + ",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(Int64))
|
|
{
|
|
a += "\"" + col.ColumnName + "\":\"" + row[col.ColumnName] + "\",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(decimal))
|
|
{
|
|
|
|
a += "\"" + col.ColumnName + "\":" + Convert.ToDecimal(row[col.ColumnName]).ToString("0.#########") + ",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(Int32) || col.DataType == typeof(Int16) || col.DataType == typeof(float) || col.DataType == typeof(short))
|
|
{
|
|
a += "\"" + col.ColumnName + "\":" + row[col.ColumnName] + ",";
|
|
continue;
|
|
}
|
|
}
|
|
a = a.Remove(a.Length - 1);
|
|
a += "},";
|
|
s += a;
|
|
}
|
|
s = s.Remove(s.Length - 1);
|
|
s += "]";
|
|
return s;
|
|
}
|
|
#endregion
|
|
#region 转换DataRow为Json
|
|
public static string ToJson(this DataRow row)
|
|
{
|
|
DateTime time = new DateTime(0x7b2, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
long DatetimeMinTimeTicks = time.Ticks;
|
|
string a = "{";
|
|
foreach (DataColumn col in row.Table.Columns)
|
|
{
|
|
if (col.ExtendedProperties.Contains("NoJson") == true) continue;
|
|
if (row.IsNull(col.ColumnName) == true)
|
|
{
|
|
a += "\"" + col.ColumnName + "\":null,";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(string) || col.DataType == typeof(System.Guid))
|
|
{
|
|
string vvv = row[col.ColumnName].ToString();
|
|
vvv = vvv.Replace("\r\n", "\\r\\n").Replace("\n", "\\n");
|
|
a += "\"" + col.ColumnName + "\":\"" + vvv + "\",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(DateTime))
|
|
{
|
|
DateTime datetime = Convert.ToDateTime(row[col.ColumnName]);
|
|
a += "\"" + col.ColumnName + "\":\"\\/Date(" + (long)((datetime.ToUniversalTime().Ticks - DatetimeMinTimeTicks) / 0x2710) + ")\\/\",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(bool))
|
|
{
|
|
a += "\"" + col.ColumnName + "\":" + row[col.ColumnName].ToString().ToLower() + ",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(Int64))
|
|
{
|
|
a += "\"" + col.ColumnName + "\":\"" + row[col.ColumnName] + "\",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(decimal))
|
|
{
|
|
a += "\"" + col.ColumnName + "\":" + Convert.ToDecimal(row[col.ColumnName]).ToString("0.#########") + ",";
|
|
continue;
|
|
}
|
|
if (col.DataType == typeof(Int32) || col.DataType == typeof(Int16) || col.DataType == typeof(float) || col.DataType == typeof(short))
|
|
{
|
|
a += "\"" + col.ColumnName + "\":" + row[col.ColumnName] + ",";
|
|
continue;
|
|
}
|
|
}
|
|
a = a.Remove(a.Length - 1);
|
|
a += "}";
|
|
return a;
|
|
}
|
|
#endregion
|
|
|
|
#region DataTable转JavaDataTable
|
|
public static JavaDataTable ToJavaDataTable(this DataTable tb)
|
|
{
|
|
var tb2 = new JavaDataTable();
|
|
foreach (DataColumn item in tb.Columns)
|
|
{
|
|
tb2.Columns.Add(new JavaDataTableColumn { ColumnName = item.ColumnName });
|
|
}
|
|
foreach (DataRow item in tb.Rows)
|
|
{
|
|
var row = new JavaDataTableRow();
|
|
row.ItemArray = item.ItemArray.ToList<object>();
|
|
tb2.Rows.Add(row);
|
|
}
|
|
return tb2;
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
|
|
|
|
}
|