2010-10-17 21 views
7

Digamos que tengo una tabla Employee como estoexportación XML desde el servidor SQL

EmpID, EmpName 

1 , hatem 

y escribo una consulta: select * from Employee for xml auto

lo que la salida será en formato XML

quiero un poco ayuda a saber cómo puedo exportar el resultado a un archivo xml para guardarlo en mi computadora (HD) ya que necesito leer los archivos .xml de esta carpeta y deserializarlos en mi aplicación .net.

+0

debe utilizar esta API: youtube.com/watch? v = hlY_PoJhlMk –

Respuesta

14

Si sólo necesita almacenar el XML y no hacer nada más que decir, esta es probablemente la forma más fácil de lograr esto - con ADO.NET recta simple:

string query = "SELECT EmployeeID, LastName, FirstName, Title, BirthDate, HireDate FROM dbo.Employees FOR XML AUTO"; 

using(SqlConnection _con = new SqlConnection("server=(local);database=Northwind;integrated security=SSPI;")) 
using (SqlCommand _cmd = new SqlCommand(query, _con)) 
{ 
    _con.Open(); 
    string result = _cmd.ExecuteScalar().ToString(); 
    _con.Close(); 

    File.WriteAllText(@"D:\test.xml", result); 
} 

Esto creará un archivo D:\test.xml (o cámbialo para que coincida con tu sistema) y colocará esas etiquetas XML en ese archivo.

El objeto SqlCommand también tiene un método .ExecuteXmlReader() que devolvería un objeto XmlReader para escanear y manipular el XML, no solo devolver una cadena. ¡Usa lo que sea más lógico para ti!

PD: también, la salida de FOR XML AUTO es un poco .... digamos ... subóptimo. Utiliza el dbo.Employee ya que es la etiqueta XML principal y así sucesivamente ... con SQL Server 2008, le recomiendo encarecidamente que consulte el uso de FOR XML PATH en su lugar - le permite ajustar y personalizar el diseño de la salida XML.

comparar su salida XML original con FOR XML AUTO

<dbo.Employees _x0040_ID="1" LastName="Davolio" FirstName="Nancy" Title="Sales Representative" BirthDate="1948-12-08T00:00:00" HireDate="1992-05-01T00:00:00" /> 
<dbo.Employees _x0040_ID="2" LastName="Fuller" FirstName="Andrew" Title="Vice President, Sales" BirthDate="1952-02-19T00:00:00" HireDate="1992-08-14T00:00:00" /> 

contra esta consulta - sólo para ver la diferencia:

SELECT 
    [EmployeeID] AS '@ID', 
    [LastName], [FirstName], 
    [Title], 
    [BirthDate], [HireDate] 
FROM 
    [dbo].[Employees] 
FOR XML PATH('Employee'), ROOT('Employees') 

de salida es:

<Employees> 
    <Employee ID="1"> 
    <LastName>Davolio</LastName> 
    <FirstName>Nancy</FirstName> 
    <Title>Sales Representative</Title> 
    <BirthDate>1948-12-08T00:00:00</BirthDate> 
    <HireDate>1992-05-01T00:00:00</HireDate> 
    </Employee> 
    <Employee ID="2"> 
    <LastName>Fuller</LastName> 
    <FirstName>Andrew</FirstName> 
    <Title>Vice President, Sales</Title> 
    <BirthDate>1952-02-19T00:00:00</BirthDate> 
    <HireDate>1992-08-14T00:00:00</HireDate> 
    </Employee> 
1

he tenido la mismo problema y he creado un .NET CLR que exporta XML a un archivo:

using System; 
using System.Data; 
using System.Data.SqlClient; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 
using System.Text; 
using System.Xml; 
using System.IO; 


public sealed class StringWriterWithEncoding : StringWriter 
{ 
    private readonly Encoding encoding; 

    public StringWriterWithEncoding(Encoding encoding) 
    { 
     this.encoding = encoding; 
    } 

    public override Encoding Encoding 
    { 
     get { return encoding; } 
    } 
} 

public partial class StoredProcedures 
{ 
    [Microsoft.SqlServer.Server.SqlProcedure] 
    public static void XMLExport (SqlXml InputXml, SqlString OutputFile) 
    { 
     try 
     { 
      if (!InputXml.IsNull && !OutputFile.IsNull) 
      {    

       XmlDocument doc = new XmlDocument(); 
       doc.LoadXml(InputXml.Value); 

       StringWriterWithEncoding sw = new StringWriterWithEncoding(System.Text.Encoding.UTF8); 
       XmlWriterSettings settings = new XmlWriterSettings 
       { 
        Indent = true, 
        IndentChars = " ", 
        NewLineChars = "\r\n", 
        NewLineHandling = NewLineHandling.Replace, 
        Encoding = System.Text.Encoding.UTF8 
       }; 

       using (XmlWriter writer = XmlWriter.Create(sw, settings)) 
       { 
        doc.Save(writer); 
       } 


       System.IO.File.WriteAllText(OutputFile.ToString(), sw.ToString(), System.Text.Encoding.UTF8); 
      } 
      else 
      { 
       throw new Exception("Parameters must be set"); 
      } 
     } 
     catch 
     { 
      throw; 
     } 
    } 
} 

He aquí un ejemplo de cómo se usa:

DECLARE @x xml 
SET @x = '<Test><Something>1</Something><AnotherOne>2</AnotherOne></Test>' 

EXEC dbo.XmlExport @x, 'c:\test.xml' 

y la salida es un archivo XML con un formato agradable:

<?xml version="1.0" encoding="utf-8"?> 
<Test> 
    <Something>1</Something> 
    <AnotherOne>2</AnotherOne> 
</Test> 
Cuestiones relacionadas