使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)

使用WCF传输DataTable:DataTable和Xml格式的字符串相互转换(C#)

 2013/11/16 13:33:48  麻雀小妖  博客园  我要评论(0)
  • 摘要:项目中要用到客户端向服务端传数据,使用WCF,绑定webHttpBinding,做了一个小例子。由于客户端是从SQL直接取出的DataTable格式的数据,传递给服务端时,DataTable无法作为参数类型,运行会报错。因此想到将DataTable转换成String类型再进行传输。为了保证服务端在收到字符串后能够再成功转换成DataTable,使用了XML格式的String。查阅了很多资料,网上很多例子都是先生成XML格式的文件,再把文件序列化后进行传输,感觉很麻烦。最终找到了一个解决方案
  • 标签:C# 使用 字符串 WCF XML

项目中要用到客户端向服务端传数据,使用WCF,绑定webHttpBinding,做了一个小例子

由于客户端是从SQL直接取出的DataTable格式的数据,传递给服务端时,DataTable无法作为参数类型,运行会报错。因此想到将DataTable转换成String类型再进行传输。为了保证服务端在收到字符串后能够再成功转换成DataTable,使用了XML格式的String。查阅了很多资料,网上很多例子都是先生成XML格式的文件,再把文件序列化后进行传输,感觉很麻烦。最终找到了一个解决方案,大致步骤如下:

1、在客户端将取到的DataTable数据加入一个DataSet中,DataSet有一个GetXml方法,可以直接转换成XML格式的字符串。

DataSet ds = new DataSet();
ds.Tables.Add(dtData);

//将数据转换为xml格式
String XmlStr = ds.GetXml();

其中dtData就是获取到的DataTable格式的数据,内容如下:ID     Name      BranchNo

                                                                             1       啤酒        分店1

                                                                             2       红酒        分店1

转换成的XML字符串的内容为:

<NewDataSet>
  <Recipe>
    <ID>1</ID>
    <Name>啤酒</Name>
    <BranchNo>分店1</BranchNo>
  </Recipe>
  <Recipe>
    <ID>2</ID>
    <Name>红酒</Name>
    <BranchNo>分店1</BranchNo>
  </Recipe>
</NewDataSet>

表示为String类型后,XmlStr变量的内容为:"<NewDataSet>\r\n  <Recipe>\r\n    <ID>1</ID>\r\n    <Name>啤酒</Name>\r\n    <BranchNo>分店1</BranchNo>\r\n  </Recipe>\r\n  <Recipe>\r\n    <ID>2</ID>\r\n    <Name>红酒</Name>\r\n    <BranchNo>分店1</BranchNo>\r\n  </Recipe>\r\n</NewDataSet>"

 

2、虽然String类型(XmlStr变量)可以作为参数直接传给服务端了,但是由于字符串中包含:\r\n,以及/,因此传输的时候仍然会报错。这里需要将这些特殊字符先替换掉,如:

String XmlStr = ds.GetXml().Replace("\r\n", "换行符").Replace("/", "~");

然后再进行传输就可以了。

因此,将DataTable转换成XML格式字符串的完整方法为:

        /// <summary>
        /// 将DataTable转换成XML格式的字符串
         /// </summary>
        /// <param name="dtData">DataTable</param>
        /// <returns>返回:XML格式的字符串</returns>
        public String DataTableToXmlStr(DataTable dtData)
        {
            try
            {
                DataSet ds = new DataSet();
                ds.Tables.Add(dtData);

                //将数据转换为xml格式
                   String XmlStr = ds.GetXml().Replace("\r\n", "换行符").Replace("/", "~");
                return XmlStr;
            }
            catch (Exception ex)
            {
                return "";
            }
        }

 

3、服务端接收到XML格式的字符串之后,首先将被替换的特殊字符还原:

String xmlStr = xmlStr.Replace("换行符", "\r\n").Replace("~", "/");

 

4、最后将XML格式的字符串再还原为DataTable格式的数据,以便对数据库进行操作。需要添加对System.Xml的引用。

将XML格式的字符串转化为DataTable的完整方法如下所示:

         /// <summary>
        /// 将XML格式的字符串转化为DataTable
        /// </summary>
        /// <param name="xmlStr">XML格式的字符串</param>
        /// <returns>返回:DataTable</returns>
        public DataTable XmlStrToData(String xmlStr)
        {
            XmlTextReader reader = null;
            try
            {
                xmlStr = xmlStr.Replace("换行符", "\r\n").Replace("~", "/");
                DataSet xmlds = new DataSet();
                StringReader stream = new StringReader(xmlStr);
                reader = new XmlTextReader(stream);
                xmlds.ReadXml(reader);

                if (reader != null)
                {
                    reader.Close();
                }

                return xmlds.Tables[0]; 
            }
            catch (Exception ex)
            {
                if (reader != null)
                {
                    reader.Close();
                }
                return null;
            }
        }

 

 5、我的例子中,服务端的接口函数如下:

        /// <summary>
        /// 分店向总店上传酒水数据
         /// </summary>
        /// <param name="recipeXml"></param>
        /// <returns></returns>
        [OperationContract(Name = "BranchRecipeXml")]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "BranchRecipeXml/{recipeXml}", BodyStyle = WebMessageBodyStyle.Bare)]
        String BranchRecipe(String recipeXml);


客户端通过调用这个方法,将DataTable格式的数据转换为XML格式的字符串,通过recipeXml参数传递给服务端,并接收返回值(String类型,表示操作是否成功)。

 

PS:客户端和服务端的具体例子就不直接给出了,不是本文要表达的重点。

 

补充:还有一种比较简单的实现方式,是刚刚才试验出来的:

1、客户端,将DataTable格式的数据(dt)写入Stream:

                                        System.IO.MemoryStream xmlStream = new System.IO.MemoryStream();
dt.WriteXml(xmlStream, XmlWriteMode.WriteSchema); xmlStream.Position
= 0;

2、将Stream作为参数传递给服务端,服务端接口如下:

        /// <summary>
        /// 分店向总店上传酒水数据
         /// </summary>
        /// <param name="recipeStr"></param>
        /// <returns></returns>
        [OperationContract(Name = "BranchRecipeStr")]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "BranchRecipeStr/{recipeXml}", BodyStyle = WebMessageBodyStyle.Bare)]
        String BranchRecipeStr(String recipeXml, Stream recipeStr);

这里Stream recipeStr参数中才是数据,前面的String recipeXml可以用于传递其他参数,如分店的编号等,如果只有Stream参数会报错。

3、服务端接收到Stream后,再转换成DataTable:

            DataTable dt = new DataTable();
            dt.ReadXml(recipeStr);

这里recipeStr就是客户端传过来的Stream recipeStr。

上一篇: Android ListView添加多种类型的ItemView 下一篇: 没有下一篇了!
发表评论
用户名: 匿名