2012-07-04 15 views
5

Tengo un procedimiento almacenado en SQL ServerLista pasar como XElement para ser utilizado como parámetro de tipo de datos XML

CREATE PROCEDURE ParseXML (@InputXML xml) 

El tipo de datos del parámetro de entrada es “xml”.

En el LINQ a SQL código para el procedimiento almacenado genera el parámetro de entrada es System.Xml.Linq.XElement

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.ParseXML")] 
public ISingleResult<ParseXMLResult> ParseXML([global::System.Data.Linq.Mapping.ParameterAttribute(Name="InputXML", DbType="Xml")] System.Xml.Linq.XElement inputXML) 

Ahora, ¿cómo puedo pasar a la siguiente lista con el método ParseXML para hacer que el almacenado procedimiento de trabajo?

EDITAR:

Después de leer la respuesta - otra solución aparece a continuación

XElement root = new XElement("ArrayOfBankAccountDTOForStatus", 
new XAttribute(XNamespace.Xmlns + "xsi", "http://www.w3.org/2001/XMLSchema-instance"), 
new XAttribute(XNamespace.Xmlns + "xsd", "http://www.w3.org/2001/XMLSchema")); 


foreach (var element in bankAccountDTOList) 
{ 

XElement ex= new XElement("BankAccountDTOForStatus", 
         new XElement("BankAccountID", element.BankAccountID), 
         new XElement("Status", element.Status)); 


root.Add(ex); 
} 

código en cuestión

 string connectionstring = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30"; 
     var theDataContext = new DBML_Project.MyDataClassesDataContext(connectionstring); 

     List<DTOLayer.BankAccountDTOForStatus> bankAccountDTOList = new List<DTOLayer.BankAccountDTOForStatus>(); 
     DTOLayer.BankAccountDTOForStatus presentAccount1 = new DTOLayer.BankAccountDTOForStatus(); 
     presentAccount1.BankAccountID = 5; 
     presentAccount1.Status = "FrozenF13"; 

     DTOLayer.BankAccountDTOForStatus presentAccount2 = new DTOLayer.BankAccountDTOForStatus(); 
     presentAccount2.BankAccountID = 6; 
     presentAccount2.Status = "FrozenF23"; 
     bankAccountDTOList.Add(presentAccount1); 
     bankAccountDTOList.Add(presentAccount2); 

     //theDataContext.ParseXML(inputXML); 

Requerido Estructura XML

enter image description here

Nota: Este XML se utiliza para algunas operaciones, no para almacenar directamente en la base de datos como XML. Necesito escribir una consulta de selección que enumerará los datos del XML.

procedimiento almacenado Lógica

DECLARE @MyTable TABLE (RowNumber int, BankAccountID int, StatusVal varchar(max)) 

INSERT INTO @MyTable(RowNumber, BankAccountID,StatusVal) 

SELECT ROW_NUMBER() OVER(ORDER BY c.value('BankAccountID[1]','int') ASC) AS Row, 
    c.value('BankAccountID[1]','int'), 
    c.value('Status[1]','varchar(32)') 
FROM 
    @inputXML.nodes('//BankAccountDTOForStatus') T(c); 

LECTURA

  1. How to serialize and save an object to database as Xml using Linq to SQL

  2. How to use a LINQ query to get XElement values when XElements have same name

  3. Linq-to-SQL With XML Database Fields -- Why does this work?

  4. http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=176385

Respuesta

7

Puede activar su lista en un fragmento de XML como esto:

 IEnumerable<XElement> el = list.Select(i => 
          new XElement("BankAccountDTOForStatus", 
           new XElement("BankAccountID", i.BankAccountID), 
           new XElement("Status", i.Status) 
          )); 

A continuación, puede convertirlo en un XElement:

 XElement root = new XElement("root", el); 

Ahora sólo lo puede transmitir a ParseXML como parámetro inputXML que es del tipo XElement. En procedimiento almacenado manejarlo de esta manera:

DECLARE @InputXML NVARCHAR(1024) = N' 
<root> 
<BankAccountDTOForStatus> 
    <BankAccountID>2</BankAccountID> 
    <Status>FrozenFA</Status> 
</BankAccountDTOForStatus> 
<BankAccountDTOForStatus> 
    <BankAccountID>3</BankAccountID> 
    <Status>FrozenSB</Status> 
</BankAccountDTOForStatus> 
</root>' 

DECLARE @handle INT 

EXEC sp_xml_preparedocument @handle OUTPUT, @InputXML 

SELECT * 
FROM OPENXML(@handle, '/root/BankAccountDTOForStatus', 1) 
WITH (
      BankAccountID INT 'BankAccountID/text()', 
      Status VARCHAR(128) 'Status/text()' 
) 

EXEC sp_xml_removedocument @handle 
2

se necesita algo como esto:

  • definir sus XML de entrada - por ejemplo, como una cadena
  • convertir eso a un XDocument
  • pasar el XDocument.Root en el método ParseXML en el contexto de datos LINQ a SQL

lo que el código sería algo como esto:

// define input XML - e.g. load from file or whatever 
string xmlInput = 
      @"<ArrayOfBankAccountDTOForStatus> 
         <BankAccountDTOForStatus> 
          <BankAccountID>2</BankAccountID> 
          <Status>FrozenFA</Status> 
         </BankAccountDTOForStatus> 
         <BankAccountDTOForStatus> 
          <BankAccountID>3</BankAccountID> 
          <Status>FrozenSB</Status> 
         </BankAccountDTOForStatus> 
        </ArrayOfBankAccountDTOForStatus>"; 

// convert that into a XDocument 
XDocument doc = XDocument.Parse(xmlInput); 

// using your DataContext - call ParseXML 
using (DataClasses1DataContext ctx = new DataClasses1DataContext()) 
{ 
    var result = ctx.ParseXML(doc.Root); 
} 

¡Y eso es todo! Ahora su XML se pasa al procedimiento almacenado y se trata allí.

Cuestiones relacionadas