C#/SQL - What's wrong with SqlDbType.Xml in procedures?

前端 未结 3 931
走了就别回头了
走了就别回头了 2020-12-07 01:55

I\'ve asked few people why using xml as a parameter in stored procedure doesn\'t work and everyone said , that\'s just the way it is. I can\'t belive that.

c         


        
相关标签:
3条回答
  • 2020-12-07 02:40
    //Create The StringWriter Object
    
    var stringWriter = new System.IO.StringWriter();
    
    //Create XmlSerializer Object for the serialization,
    RequestUpdateRBCustomerExternal is the Class of which type having all the values
    
    var serializer = new XmlSerializer(typeof(RequestUpdateRBCustomerExternal));
    
    //request is of type RequestUpdateRBCustomerExternal
    
    serializer.Serialize(stringWriter, request);
    
    SqlXml xml = new SqlXml(new XmlTextReader(stringWriter.ToString(), XmlNodeType.Document, null));
    
    cmd.CommandText ="insert into SAPDataTracking values('"+DateTime.Now+"','"+xml.Value+"')";
    
    0 讨论(0)
  • 2020-12-07 02:44

    Instead of using the Add Method, try using AddWithValue where you do not need to specify the type just the name and the value. Unless you are using a different direction to input?

    0 讨论(0)
  • 2020-12-07 02:57

    It does work. You will have to set up the Value as SqlXml and not a string, but it can be done. Imagine this table:

    CREATE TABLE XmlTest
    (
        [XmlTestId] [int]   identity(1,1) primary key,
        [XmlText]   [xml]   NOT NULL
    )
    

    And the sproc:

    CREATE PROCEDURE XmlTest_Insert
    (
        @XmlText    xml
    )
    AS
    
    INSERT INTO XmlTest (XmlText)
    VALUES (@XmlText)
    

    Now picture a console application that looks like this:

    using System.Data.SqlClient;
    using System.Data;
    using System.Data.SqlTypes;
    using System.Xml;
    
    namespace TestConsole
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                string xmlDoc = "<root><el1>Nothing</el1></root>";
                string connString = "server=(local);database=IntroDB;UID=sa;PWD=pwd";
                SqlConnection conn = new SqlConnection(connString);
                SqlCommand cmd = new SqlCommand("XmlTest_Insert", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter param = new SqlParameter("@XmlText", SqlDbType.Xml);
                param.Value = new SqlXml(new XmlTextReader(xmlDoc
                               , XmlNodeType.Document, null));
                cmd.Parameters.Add(param);
    
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Dispose();
            }
        }
    }
    

    Bingo!

    This was done in Visual Studio 2008 (.NET 3.5), but I am fairly sure it should work in Visual Studio 2005 (2.0 Framework), as well.

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