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

在SQLServer2008中,如何将XML从C#传递到存储过程?

  •  24
  • Geeth  · 技术社区  · 15 年前

    我想将xml文档传递到sql server存储过程,如下所示:

    CREATE PROCEDURE BookDetails_Insert (@xml xml)
    

    我想将一些字段数据与其他表数据进行比较,如果匹配,则必须将记录插入表中。

    1. 如何将XML传递到存储过程?我试过了,但没用: [工作]

      command.Parameters.Add(
          new SqlParameter("@xml", SqlDbType.Xml)
          {
              Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml,
                                 XmlNodeType.Document, null))
          });
      
    2. 如何访问存储过程中的XML数据?

    编辑: [工作]

     String sql = "BookDetails_Insert";
            XmlDocument xmlToSave = new XmlDocument();
            xmlToSave.Load("C:\\Documents and Settings\\Desktop\\XML_Report\\Books_1.xml");
    
            SqlConnection sqlCon = new SqlConnection("...");
            using (DbCommand command = sqlCon.CreateCommand())
            {
                **command.CommandType = CommandType.StoredProcedure;**
                command.CommandText = sql;
                command.Parameters.Add(
                  new SqlParameter("@xml", SqlDbType.Xml)
                  {
                      Value = new SqlXml(new XmlTextReader(xmlToSave.InnerXml
                                 , XmlNodeType.Document, null))
                  });
    
                sqlCon.Open();
                DbTransaction trans = sqlCon.BeginTransaction();
                command.Transaction = trans;
    
                try
                {
                    command.ExecuteNonQuery();
                    trans.Commit();
                    sqlCon.Close();
                }
                catch (Exception)
                {
                    trans.Rollback();
                    sqlCon.Close();
                    throw;
                }
    

    编辑2

      <booksdetail> <isn_13>700001048</isbn_13> <isn_10>01048B</isbn_10>       
        <Image_URL>http://www.landt.com/Books/large/00/7010000048.jpg</Image_URL>   
        <title>QUICK AND FLUPKE</title> <Description> PRANKS AND JOKES QUICK AND FLUPKE </Description> </booksdetail> 
    
    4 回复  |  直到 15 年前
        1
  •  11
  •   Community Mohan Dere    9 年前

    关于你问题的第二部分,请看我对你的回答 Stored procedure: pass XML as an argument and INSERT (key/value pairs) 有关如何在存储过程中使用XML的示例。

    编辑 :下面的示例代码基于注释中给出的特定示例。

    declare @MyXML xml
    
    set @MyXML = '<booksdetail> 
                      <isbn_13>700001048</isbn_13> 
                      <isbn_10>01048B</isbn_10> 
                      <Image_URL>http://www.landt.com/Books/large/00/70100048.jpg</Image_URL> 
                      <title>QUICK AND FLUPKE</title> 
                      <Description> PRANKS AND JOKES QUICK AND FLUPKE - CATASTROPHE QUICK AND FLUPKE </Description> 
                  </booksdetail>'
    
    select Book.detail.value('(isbn_13/text())[1]','varchar(100)') as isbn_13, 
           Book.detail.value('(isbn_10/text())[1]','varchar(100)') as isbn_10, 
           Book.detail.value('(Image_URL/text())[1]','varchar(100)') as Image_URL, 
           Book.detail.value('(title/text())[1]','varchar(100)') as title, 
           Book.detail.value('(Description/text())[1]','varchar(100)') as Description
        from @MyXML.nodes('/booksdetail') as Book(detail)     
    
        2
  •  2
  •   Zafer    15 年前

    如中所述 http://support.microsoft.com/kb/555266 ,需要将xml数据作为NText传递。

    可以按如下方式查询XML变量:

    DECLARE @PeopleXml XML
        SET @PeopleXml = '<People>
        <Person>
        <Name>James</Name>
        <Age>28</Age>
        </Person>
        <Person>
        <Name>Jane</Name>
        <Age>24</Age>
        </Person>
        </People>'
    --  put [1] at the end to ensure the path expression returns a singleton.
    SELECT p.c.value('Person[1]/Name[1]', 'varchar(50)')
    FROM @PeopleXml.nodes('People') p(c) -- table and column aliases
    
        3
  •  1
  •   Oleks    14 年前
    public static string UpdateStaticCertificateFormateNo1Data(StaticCertificateFormatNo1LogicLayer StaticFormat1Detail)
    {
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ToString());
        con.Open();
        string strXMLRegistrationDetails, strXMLQutPut = "<root></root>";
        System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(StaticFormat1Detail.GetType());
        System.IO.MemoryStream stream = new System.IO.MemoryStream();
        x.Serialize(stream, StaticFormat1Detail);
        stream.Position = 0;
        XmlDocument xd = new XmlDocument();
        xd.Load(stream);
        strXMLRegistrationDetails = xd.InnerXml;
        SqlTransaction trn = con.BeginTransaction();
        try
        {
            SqlParameter[] paramsToStore = new SqlParameter[2];
            paramsToStore[0] = ControllersHelper.GetSqlParameter("@StaticFormat1Detail", strXMLRegistrationDetails, SqlDbType.VarChar);
            paramsToStore[1] = ControllersHelper.GetSqlParameter("@OutPut", strXMLQutPut, SqlDbType.VarChar);
            SqlHelper.ExecuteNonQuery(trn, CommandType.StoredProcedure, "UPS_UpdateStaticCertificateFormateNo1Detail", paramsToStore);
            trn.Commit();
        }
        catch (Exception ex)
        {
            trn.Rollback();
            con.Close();
            if (ex.Message.Contains("UNIQUE KEY constrastring"))
            { return "Details already in  List"; }
            else { return ex.Message; }
        }
        con.Close();
        return "Details successfully Added...";
    }
    
        4
  •  0
  •   tster    15 年前

    您将主要使用xPath和XQuery来查询和修改XML数据。

    http://msdn.microsoft.com/en-us/library/ms190798.aspx

    我不能说得更具体,因为你的问题非常模糊。如果您想获得有关如何使用XPath和XQuery的帮助,请询问有关如何执行某些操作的具体问题。