Passing Parameters as Xml to a Stored Procedure

后端 未结 4 1322
庸人自扰
庸人自扰 2020-12-29 15:34

I\'ve got a requirement to pass parameters as Xml to my stored procedures.

I have a WCF service in the middle tier that makes calls to my data layer which in turn fo

相关标签:
4条回答
  • 2020-12-29 16:03

    I would put the xml construction code inside the domain object. That way, you can just call obj.GetXML() from Web Service or data layer.

    0 讨论(0)
  • 2020-12-29 16:06

    Once you use Bob The Janitor's solution and you have your XML.

    Create your stored procedure with a XML parameter. Then depending on how much XML you have and what your doing with it you can use Xquery or OpenXML to shred the XML document. Extract the data and perform the right action. This example is basic and pseudocode like but you should get the idea.

    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
    
    0 讨论(0)
  • 2020-12-29 16:12

    You could just use an object Serialization class like this

     public class Serialization
        {
            /// <summary>
            /// Serializes the object.
            /// </summary>
            /// <param name="myObject">My object.</param>
            /// <returns></returns>
            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;            
            }
    
            /// <summary>
            /// Deserializes the object.
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="XmlizedString">The p xmlized string.</param>
            /// <returns></returns>
            public static T DeserializeObject<T>(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;
            } 
    
            /// <summary>
            /// To convert a Byte Array of Unicode values (UTF-8 encoded) to a complete String.
            /// </summary>
            /// <param name="characters">Unicode Byte Array to be converted to String</param>
            /// <returns>String converted from Unicode Byte Array</returns>
            private static String UTF8ByteArrayToString(Byte[] characters)
            {
                UTF8Encoding encoding = new UTF8Encoding();
                String constructedString = encoding.GetString(characters);
                return (constructedString);
            }
    
    
    
            /// <summary>
            /// Converts the String to UTF8 Byte array and is used in De serialization
            /// </summary>
            /// <param name="pXmlString"></param>
            /// <returns></returns>
            private static Byte[] StringToUTF8ByteArray(String pXmlString)
            {
                UTF8Encoding encoding = new UTF8Encoding();
                Byte[] byteArray = encoding.GetBytes(pXmlString);
                return byteArray;
            } 
        }
    

    then you don't have to build the XML by hand, plus you can use this with any item to transform it using XSLT

    0 讨论(0)
  • 2020-12-29 16:28

    If you must use xml; then rather than passing around a dictionary, I'd use a class that represents that data, and use XmlSerializer to fetch it as 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();
    

    This makes it much easier to manage which arguments apply to which queries, in an object-oriented way. It also means you don't have to do your own xml escaping...

    0 讨论(0)
提交回复
热议问题