ASp.net 在用WCF做数据库服务时 由于DataTable造成数据反序列化失败

1 篇文章 0 订阅
1 篇文章 0 订阅
/// <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)。
 
 
 
 
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值