将参数作为Xml传递给存储过程

我有一个要求将参数作为Xml传递给我的存储过程。

我在中间层有一个WCF服务,它调用我的数据层,然后将请求转发到适当的存储过程。

设计是WCF服务负责构建Xml以传递到存储库。

我只是想知道是否要控制中间层中Xml中包含的参数,还是使用客户端构建的字典,然后将其转换为中间层的Xml?

目前我已经选择了后者 – 例如:

public TestQueryResponseMessage TestQuery(TestQueryRequestMessage message) { var result = Repository.ExecuteQuery("TestQuery", ParamsToXml(message.Body.Params)); return new TestQueryResponseMessage { Body = new TestQueryResponse { TopicItems = result; } } } private string ParamsToXml(Dictionary nvc) { //TODO: Refactor StringBuilder sb = new StringBuilder(); sb.Append(""); foreach (KeyValuePair param in nvc) { sb.Append(""); sb.Append(""); sb.Append(param.Value); sb.Append(""); sb.Append(""); } sb.Append(""); return sb.ToString(); } 

但是我可能需要第一种方式。 例如

 public TestQueryResponseMessage TestQuery(TestQueryRequestMessage message) { string xml = string.Format("{0}",message.Body.TestParameter) var result = Repository.ExecuteQuery("TestQuery", xml); return new TestQueryResponseMessage { Body = new TestQueryResponse { TopicItems = result; } } } 

这个hivemind推荐什么?

如果你必须使用xml; 然后我使用一个代表该数据的类,而不是传递一个字典,并使用XmlSerializer将其作为xml获取:

 [Serializable, XmlRoot("args")] public class SomeArgs { [XmlElement("foo")] public string Foo { get; set; } [XmlAttribute("bar")] public int Bar { get; set; } } ... SomeArgs args = new SomeArgs { Foo = "abc", Bar = 123 }; XmlSerializer ser = new XmlSerializer(typeof(SomeArgs)); StringWriter sw = new StringWriter(); ser.Serialize(sw, args); string xml = sw.ToString(); 

这使得以面向对象的方式管理哪些参数适用于哪些查询变得更加容易。 这也意味着你不必自己做xml转义……

一旦你使用了Bob The Janitor的解决方案,你就拥有了XML。

使用XML参数创建存储过程。 然后,根据您拥有多少XML以及使用它做什么,您可以使用Xquery或OpenXML来粉碎XML文档。 提取数据并执行正确的操作。 这个例子是基本的和伪代码,但你应该明白这个想法。

 CREATE PROCEDURE [usp_Customer_INS_By_XML] @Customer_XML XML AS BEGIN EXEC sp_xml_preparedocument @xmldoc OUTPUT, @Customer_XML --OPEN XML example of inserting multiple customers into a Table. INSERT INTO CUSTOMER ( First_Name Middle_Name Last_Name ) SELECT First_Name ,Middle_Name ,Last_Name FROM OPENXML (@xmldoc, '/ArrayOfCustomers[1]/Customer',2) WITH( First_Name VARCHAR(50) ,Middle_Name VARCHR(50) ,Last_Name VARCHAR(50) ) EXEC sp_xml_removedocument @xmldoc END 

您可以像这样使用对象序列化类

  public class Serialization { ///  /// Serializes the object. ///  /// My object. ///  public static XmlDocument SerializeObject(Object myObject) { XmlDocument XmlObject = new XmlDocument(); String XmlizedString = string.Empty; try { MemoryStream memoryStream = new MemoryStream(); XmlSerializer xs = new XmlSerializer(myObject.GetType()); XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); xs.Serialize(xmlTextWriter, myObject); memoryStream = (MemoryStream)xmlTextWriter.BaseStream; XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray()); } catch (Exception e) { System.Console.WriteLine(e); } XmlObject.LoadXml(XmlizedString); return XmlObject; } ///  /// Deserializes the object. ///  ///  /// The p xmlized string. ///  public static T DeserializeObject(String XmlizedString) { XmlSerializer xs = new XmlSerializer(typeof(T)); MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(XmlizedString)); //XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); Object myObject = xs.Deserialize(memoryStream); return (T)myObject; } ///  /// To convert a Byte Array of Unicode values (UTF-8 encoded) to a complete String. ///  /// Unicode Byte Array to be converted to String /// String converted from Unicode Byte Array private static String UTF8ByteArrayToString(Byte[] characters) { UTF8Encoding encoding = new UTF8Encoding(); String constructedString = encoding.GetString(characters); return (constructedString); } ///  /// Converts the String to UTF8 Byte array and is used in De serialization ///  ///  ///  private static Byte[] StringToUTF8ByteArray(String pXmlString) { UTF8Encoding encoding = new UTF8Encoding(); Byte[] byteArray = encoding.GetBytes(pXmlString); return byteArray; } } 

那么你不必手工构建XML,而且你可以将它与任何项目一起使用来使用XSLT对其进行转换

我会把xml构造代码放在域对象中。 这样,您只需从Web服务或数据层调用obj.GetXML()即可。