/// <summary>
/// Creater:成
/// Date:2011-12-13
/// DataTable扩展方法:将DataTable类型转化为指定类型的实体集合
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="dt">DataTable</param>
/// <returns>指定类型的实体集合</returns>
public static ObservableCollection<T> ToObservableCollection<T>(this DataTable dt) where T : class, new()
{
if (dt == null)
{
return null;
}
else
{
DataTable table = dt;
ObservableCollection<T> observables = new ObservableCollection<T>();
int rowCount = table.Rows.Count;
int columnCount = table.Columns.Count;
for (int i = 0; i < rowCount; i++)
{
T local = (T)Activator.CreateInstance(typeof(T));
PropertyInfo[] properties = local.GetType().GetProperties();
foreach (PropertyInfo info in properties)
{
for (int j = 0; j < columnCount; j++)
{
string s = info.Name;
if (info.Name.Equals(table.Columns[j].ColumnName))
{
if (table.Rows[i][j] != DBNull.Value)
{
string value = table.Rows[i][j].ToString();
info.SetValue(local, table.Rows[i][j], null);
}
else
{
info.SetValue(local, null, null);
}
break;
}
}
}
observables.Add(local);
}
return observables;
}
}
/// <summary>
/// Creater:成
/// Date:2012-2-17
/// DataTable扩展方法:将DataTable类型转化为指定xml类型字符串
/// </summary>
/// <param name="dt">DataTable</param>
/// <returns>xml类型字符串</returns>
public static String ToXml(this DataTable dt)
{
string xml;
if (dt == null)
{
return null;
}
else
{
DataTable table = dt;
xml = @"<?xml version='1.0'?><NewDataSet>";
for (int i = 0; i < table.Rows.Count; i++)
{
xml += "<table>";
for (int j = 0; j < table.Columns.Count; j++)
{
string ColumnsName = table.Columns[j].ToString();
xml += "<" + ColumnsName + ">" + table.Rows[i][j].ToString() + "</" + ColumnsName + ">";
}
xml += "</table>";
}
xml += "</NewDataSet>";
}
return xml;
}
/// <summary>
/// Creater:成
/// Date:2012-2-17
/// String扩展方法:将String类型转化为DataTable
/// </summary>
/// <param name="xml">字符串</param>
/// <returns>DataTable</returns>
public static DataTable XmlToDataTable(this string xml)
{
DataTable table = new DataTable();
if (xml == null)
{
return table;
}
try
{
XmlDocument docu = new XmlDocument();
docu.LoadXml(xml);
XmlNodeList node = docu.SelectSingleNode("NewDataSet").ChildNodes;
int int_columen = 0;
DataColumn[] columen = null;
foreach (XmlNode xmlNode in node)
{
ArrayList list = new ArrayList();
XmlElement Element = (XmlElement)xmlNode;
columen = new DataColumn[Element.ChildNodes.Count];
for (int i = 0; i < Element.ChildNodes.Count; i++)
{
list.Add(Element.ChildNodes[i].InnerText);
if (int_columen == 0)
{
columen[i] = new DataColumn();
columen[i].AllowDBNull = true;
columen[i].ColumnName = Element.ChildNodes[i].Name;
}
}
if (int_columen == 0)
{
table.Columns.AddRange(columen);
}
DataRow dr = table.NewRow();
for (int i = 0; i < list.Count; i++)
{
dr[i] = list[i].ToString();
}
table.Rows.Add(dr);
int_columen++;
}
}
catch (Exception)
{
throw;
}
return table;
}
}
本人在用我WCF做数据服务是返回了DataTable类型 在生成代码时不知为什么一直将Guid类型变成了String类型造成了在客户端和服务器端传递的数据丢失。现在只好将DataTable转化成Xml传递 再将xml转变成DataTable 比较繁琐 不知谁有没有好的办法 我用的是微软企业库的类对数据库进行操作,其实微软企业库可以直接将DataTable转化成xml 但是在转化过程中丢失列为空值的列,这样造成了在还原成DataTable时就会造成有些列数据错误,哎 现在只好自己写代码扩展了DataTable,将DataTable转化成xml 以上的代码 方法 ToXml()是将DataTable转化成xml(服务器端转化) 而方法XmlDataTable()是将xml转化成DataTable(客户端还原成DataTable)。