using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Web.Script.Serialization;
using System.Xml;
using System.Xml.Serialization;
namespace QRWL.Web.Common
{
///
/// DataTable相关方法
///
public class DataTableHelper
{
#region 克隆数据行
///
/// 克隆数据行
///
/// 被复制的行数据
/// 新的行数据
/// 要复制的字段
///
private static DataRow createRowClone(DataRow sourceRow, DataRow newRow, string[] fieldNames)
{
foreach (string field in fieldNames)
{
newRow[field] = sourceRow[field];
}
return newRow;
}
#endregion
#region DataRow转HashTable
///
/// DataRow转HashTable
///
/// DataRow数据源
///
public static Hashtable DataRowToHashTable(DataRow dr)
{
Hashtable htReturn = new Hashtable(dr.ItemArray.Length);
foreach (DataColumn dc in dr.Table.Columns)
{
htReturn.Add(dc.ColumnName, dr[dc.ColumnName]);
}
return htReturn;
}
#endregion
#region DataTable转ArrayList
///
/// DataTable转ArrayList
///
/// DataTable数据源
///
public static IList DataTableToArrayList(DataTable dt)
{
if (dt == null)
{
return new List();
}
IList datas = new List();
foreach (DataRow dr in dt.Rows)
{
Hashtable ht = DataRowToHashTable(dr);
datas.Add(ht);
}
return datas;
}
#endregion
#region DataTable转Hashtable
///
/// DataTable转Hashtable
///
/// DataTable数据源
///
public static Hashtable DataTableToHashtable(DataTable dt)
{
Hashtable ht = new Hashtable();
foreach (DataRow dr in dt.Rows)
{
for (int i = 0; i < dt.Columns.Count; i++)
{
string key = dt.Columns[i].ColumnName;
ht[key.ToUpper()] = dr[key];
}
}
return ht;
}
#endregion
#region 将DataTable指定字段内容转换成Hashtable
///
/// 将DataTable指定字段内容转换成Hashtable
/// 存储表中对应字段的内容到Hashtable
///
/// DataTable数据源
/// 字段名称
/// 字段键值
///
public static Hashtable DataTableToHashtableByKeyValue(DataTable dt, string keyField, string valFiled)
{
Hashtable ht = new Hashtable();
if (dt != null)
{
foreach (DataRow dr in dt.Rows)
{
string key = dr[keyField].ToString();
ht[key] = dr[valFiled];
}
}
return ht;
}
#endregion
#region 数据行对象转化成泛型
///
/// 数据行对象转化成泛型
///
///
/// DataTable数据源
///
public static IList DataTableToIList(DataTable dt)
{
IList list = new List();
string tempName = "";
foreach (DataRow dr in dt.Rows)
{
T obj = Activator.CreateInstance();
PropertyInfo[] propertys = obj.GetType().GetProperties();
foreach (PropertyInfo pi in propertys)
{
tempName = pi.Name;
if (dt.Columns.Contains(tempName) && pi.CanWrite)
{
object value = dr[tempName];
if (value != DBNull.Value)
{
pi.SetValue(obj, value, null);
}
}
}
list.Add(obj);
}
return list;
}
#endregion
#region DataTable转化成xml
///
/// DataTable 转化成xml
///
/// DataTable数据源
///
public static string DataTableToXML(DataTable dt)
{
if (dt != null)
{
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
new XmlSerializer(typeof(DataTable)).Serialize(writer, dt);
writer.Close();
return sb.ToString();
}
return string.Empty;
}
#endregion
#region 比较对象是否一致
///
/// 比较对象是否一致
///
/// 对比的数据内容
/// 对比的数据行
/// 比较的字段
///
private static bool fieldValuesAreEqual(object[] lastValues, DataRow currentRow, string[] fieldNames)
{
for (int i = 0; i < fieldNames.Length; i++)
{
if (!((lastValues[i] != null) && lastValues[i].Equals(currentRow[fieldNames[i]])))
{
return false;
}
}
return true;
}
#endregion
#region 根据条件获取新DataTable
///
/// 根据条件获取新DataTable
///
/// 被复制的DataTable
/// 查询条件
///
public static DataTable GetNewDataTable(DataTable dt, string condition)
{
if (IsExistRows(dt))
{
if (condition.Trim() == "")
{
return dt;
}
DataTable newdt = dt.Clone();
DataRow[] dr = dt.Select(condition);
for (int i = 0; i < dr.Length; i++)
{
newdt.ImportRow(dr[i]);
}
return newdt;
}
return null;
}
#endregion
#region DataTable分页
///
/// DataTable分页
///
/// DataTable数据源
/// 当前页
/// 页码
///
public static DataTable GetPagedTable(DataTable dt, int PageIndex, int PageSize)
{
if (PageIndex == 0)
{
return dt;
}
DataTable newdt = dt.Copy();
newdt.Clear();
int rowbegin = (PageIndex - 1) * PageSize;
int rowend = PageIndex * PageSize;
if (rowbegin < dt.Rows.Count)
{
if (rowend > dt.Rows.Count)
{
rowend = dt.Rows.Count;
}
for (int i = rowbegin; i <= (rowend - 1); i++)
{
DataRow newdr = newdt.NewRow();
DataRow dr = dt.Rows[i];
foreach (DataColumn column in dt.Columns)
{
newdr[column.ColumnName] = dr[column.ColumnName];
}
newdt.Rows.Add(newdr);
}
}
return newdt;
}
#endregion
#region 判断是否有数据行
///
/// 判断是否有数据行
///
/// DataTable数据源
///
public static bool IsExistRows(DataTable dt)
{
return ((dt != null) && (dt.Rows.Count > 0));
}
#endregion
#region 获取去重后的数据源
///
/// 获取去重后的数据源
///
/// DataTable数据源
/// 查重字段
///
public static DataTable SelectDistinct(DataTable SourceTable, string[] FieldNames)
{
return SelectDistinct(SourceTable, FieldNames, false);
}
///
/// 获取去重后的数据源
///
/// DataTable数据源
/// 查重字段
/// 返回字段类型是否都是字符串
///
public static DataTable SelectDistinct(DataTable SourceTable, string[] FieldNames, bool TypeofString)
{
if ((FieldNames == null) || (FieldNames.Length == 0))
{
throw new ArgumentNullException("FieldNames");
}
object[] lastValues = new object[FieldNames.Length];
DataTable newTable = new DataTable();
foreach (string fieldName in FieldNames)
{
newTable.Columns.Add(fieldName, TypeofString ? typeof(string) : SourceTable.Columns[fieldName].DataType);
}
DataRow[] orderedRows = SourceTable.Select("", string.Join(",", FieldNames));
foreach (DataRow row in orderedRows)
{
if (!fieldValuesAreEqual(lastValues, row, FieldNames))
{
newTable.Rows.Add(createRowClone(row, newTable.NewRow(), FieldNames));
setLastValues(lastValues, row, FieldNames, TypeofString);
}
}
return newTable;
}
#region 获取指定字段的内容
///
/// 获取指定字段的内容
///
/// 返回的数据集
/// DataRow数据源
/// 指定的字段
/// 返回字段类型是否都是字符串
private static void setLastValues(object[] lastValues, DataRow sourceRow, string[] fieldNames, bool TypeofString = false)
{
for (int i = 0; i < fieldNames.Length; i++)
{
lastValues[i] = TypeofString ? sourceRow[fieldNames[i]].ToString() : sourceRow[fieldNames[i]];
}
}
#endregion
#endregion
#region 将DataTable进行正序排序
///
/// 将DataTable进行正序排序
///
/// DataTable数据源
/// 排序字段,数组类型
///
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 = tmp + sorts[i] + ",";
}
dt.DefaultView.Sort = tmp.TrimEnd(new char[] { ',' });
}
return dt;
}
#endregion
#region 根据枚举转化对应的DataTable
///
/// 根据枚举转化对应的DataTable
///
public static void DataTableTanslate(DataTable dataTable, Dictionary> dictionary)
{
if (dictionary == null)
{
return;
}
string str = "_" + Guid.NewGuid().ToString().Substring(0, 10).Replace("-", "_");
foreach (DataRow dataRow in dataTable.Rows)
{
foreach (string current in dictionary.Keys)
{
if (dataTable.Columns.IndexOf(current) >= 0)
{
if (dataTable.Columns.IndexOf(current + str) < 0)
{
dataTable.Columns[current].ColumnName = current + str;
dataTable.Columns.Add(current, typeof(string));
}
string text = "";
if (dictionary[current].TryGetValue(dataRow[current + str].ToString(), out text))
{
dataRow[current] = text;
}
else
{
string[] array = dataRow[current + str].ToString().Split(new char[]
{
','
});
if (array.Length > 1)
{
for (int i = 0; i < array.Length; i++)
{
if (dictionary[current].TryGetValue(array[i].ToString(), out text))
{
array[i] = text;
}
}
}
dataRow[current] = string.Join(",", array);
}
}
}
}
}
#endregion
#region 转换DataTable字段类型
///
/// 转换DataTable字段类型
///
/// DataTable数据源
///
public static DataTable ConvertOraclTableToDoNetTable(DataTable table)
{
DataTable dt = new DataTable();
foreach (DataColumn dc in table.Columns)
{
DataColumn column = new DataColumn();
column.DataType = GetDataType(dc.DataType);
column.ColumnName = dc.ColumnName;
column.Caption = dc.Caption;
dt.Columns.Add(column);
}
dt.TableName = table.TableName;
dt.Merge(table, false, MissingSchemaAction.Ignore);
return dt;
}
#endregion
#region 解析字段类型
///
/// 解析字段类型
///
/// 字段类型
///
public static Type GetDataType(Type dataType)
{
switch (dataType.ToString())
{
case "System.Double":
return System.Type.GetType("System.Decimal");
case "System.Int32":
return System.Type.GetType("System.Decimal");
case "System.Int16":
return System.Type.GetType("System.Decimal");
case "System.Int64":
return System.Type.GetType("System.Decimal");
default:
return dataType;
}
}
#endregion
#region DataRow转DataTable
///
/// DataRow转DataTable
///
/// 数据来源DataTable
/// 过滤成DataRow的条件
///
public static DataTable DataRowToDataTable(DataTable dt, string strWhere)
{
DataTable dtNew = dt.Clone(); //复制数据源的表结构
DataRow[] dr = dt.Select(strWhere); //strWhere条件筛选出需要的数据!
for (int i = 0; i < dr.Length; i++)
{
dtNew.Rows.Add(dr[i].ItemArray); // 将DataRow添加到DataTable中
}
return dtNew;
}
#endregion
#region 判断DataTale中判断某个字段中包含某个数据
///
/// 判断DataTale中判断某个字段中包含某个数据
///
/// 数据来源DataTable
/// 需要比较的列
/// 需要比较的具体数据
///
public static Boolean IsColumnIncludeData(DataTable dt, String columnName, string fieldData)
{
if (dt == null)
{
return false;
}
else
{
DataRow[] dataRows = dt.Select(columnName + "='" + fieldData + "'");
if (dataRows.Length.Equals(1))
{
return true;
}
else
{
return false;
}
}
}
#endregion
#region 方法 -> 获取指定页码Datatable数据
///
/// 获取指定页码Datatable数据
///
/// 源数据
/// 每页返回的数量
/// 返回第几页数据
/// Datatable数据格式
public static DataTable GetDataTableWithPageSize(DataTable dtOrigin, int pageSize, int pageIndex)
{
if (pageIndex == 0)
{
pageIndex = 1;
}
if (pageSize == 0)
{
pageSize = 10;
}
//克隆数据源
DataTable dtClone = dtOrigin.Clone();
dtClone.Columns.Add("RN", typeof(int));
//开始插入数据源
for (int RowCount = 0; RowCount < pageSize; RowCount++)
{
//获取当前数据源行数
int RN = pageSize * (pageIndex - 1) + RowCount;
//如果行数大于数据源实际数量,则直接跳过
if (RN >= dtOrigin.Rows.Count)
{
break;
}
//获取当前数据源内容
DataRow EndAccountDataRow = dtOrigin.Rows[RN];
//创建一个新 System.Data.DataRow 具有与表相同的架构
DataRow _DataRow = dtClone.NewRow();
//开始插入数据
for (int ColumnsCount = 0; ColumnsCount < dtOrigin.Columns.Count; ColumnsCount++)
{
_DataRow[ColumnsCount] = EndAccountDataRow[ColumnsCount];
}
_DataRow["RN"] = RN + 1;
//将数据加入到克隆的DataTable中
dtClone.Rows.Add(_DataRow);
}
return dtClone;
}
#endregion
#region 方法 -> 【Json字符串】转换为DataTable数据集合
///
/// 【Json字符串】转换为DataTable数据集合
///
///
///
public static DataTable ToDataTable(string json)
{
DataTable dataTable = new DataTable(); //实例化
DataTable result;
try
{
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.MaxJsonLength = Int32.MaxValue; //取得最大数值
if (!string.IsNullOrEmpty(json))
{
ArrayList arrayList = javaScriptSerializer.Deserialize(json);
if (arrayList.Count > 0)
{
foreach (Dictionary dictionary in arrayList)
{
if (dictionary.Keys.Count == 0)
{
result = dataTable;
return result;
}
//Columns
if (dataTable.Columns.Count == 0)
{
foreach (string current in dictionary.Keys)
{
if (IsType(dictionary[current].GetType(), "System.Nullable`1[System.Int16]") ||
IsType(dictionary[current].GetType(), "System.Nullable`1[System.Int32]") ||
IsType(dictionary[current].GetType(), "System.Nullable`1[System.Int64]") ||
IsType(dictionary[current].GetType(), "System.Nullable`1[System.Double]") ||
IsType(dictionary[current].GetType(), "System.Nullable`1[System.Decimal]") ||
dictionary[current].GetType() == typeof(System.Int16) ||
dictionary[current].GetType() == typeof(System.Int32) ||
dictionary[current].GetType() == typeof(System.Int64) ||
dictionary[current].GetType() == typeof(System.Double) ||
dictionary[current].GetType() == typeof(System.Decimal))
{
dataTable.Columns.Add(current, typeof(System.Decimal));
}
else
{
dataTable.Columns.Add(current, dictionary[current].GetType());
}
}
}
//Rows
DataRow dataRow = dataTable.NewRow();
foreach (string current in dictionary.Keys)
{
try
{
dataRow[current] = dictionary[current];
}
catch { }
}
dataTable.Rows.Add(dataRow); //循环添加行到DataTable中
}
}
}
}
catch (Exception ex)
{
SuperMap.RealEstate.Utility.ErrorLogHelper.Write(ex);
}
result = dataTable;
return result;
}
#endregion
#region 方法 -> 【object】转换为DataTable数据集合
///
/// object转换为DataTable数据集合
///
/// 数据对象
///
public static DataTable ObjectToTable(object obj)
{
Type t;
//获取对象数据类型
if (obj.GetType().IsGenericType)
{
//泛型
t = obj.GetType().GetGenericTypeDefinition();
}
else
{
t = obj.GetType();
}
if (t == typeof(List<>) || t == typeof(IEnumerable<>))
{
//是列表或者枚举
DataTable dt = new DataTable();
IEnumerable