代码之家  ›  专栏  ›  技术社区  ›  Jacob

C/SQL-过程中sqldbtype.xml有什么问题?

  •  5
  • Jacob  · 技术社区  · 15 年前

    我问过很少有人为什么在存储过程中使用XML作为参数不起作用,每个人都说,这就是事实。我不能相信。

    command.Parameters.Add("@xmldoc", SqlDbType.Xml);
    

    这就是编译器返回错误的地方,我不能使用nvarchar,因为它限制为4K。XML是完美的,因为它可以有2个大。

    为什么其他sqldbtypes工作良好,而这一个重试错误?

    *

    错误:指定的参数已用完 有效值的范围。参数 名称:@xmldoc:无效的sqldbtype 枚举值:25。

    *

    3 回复  |  直到 9 年前
        1
  •  13
  •   yeye    11 年前

    它确实有效。您必须将该值设置为sqlxml而不是字符串,但可以这样做。想象一下这张桌子:

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

    和SPROC:

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

    现在想象一个控制台应用程序,它看起来像这样:

    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();
            }
        }
    }
    

    答对了!

    这是在Visual Studio 2008(.NET 3.5)中完成的,但我确信它也应该在Visual Studio 2005(2.0框架)中工作。

        2
  •  0
  •   REA_ANDREW    15 年前

    不要使用add方法,尝试在不需要仅指定名称和值的类型的情况下使用addWithValue。除非你用不同的方向输入?

        3
  •  -2
  •   Nikos    9 年前
    //创建StringWriter对象
    
    var stringwriter=new system.io.stringwriter();
    
    //为序列化创建XmlSerializer对象,
    RequestUpdaterCustomerInternal是一个类,该类的类型具有所有值
    
    var serializer=new xmlserializer(typeof(requestupdaterbcustomerexternal));
    
    //请求的类型为requestupdaterbcustomerexternal
    
    serializer.serialize(StringWriter,请求);
    
    sqlxml xml=new sqlxml(new xmlTextReader(StringWriter.ToString(),xmlNodeType.document,null));
    
    cmd.commandText=“插入到SAPDataTracking值中(”+datetime.now+“','”+xml.value+“')”;