2010-10-17 8 views
7

Disons que j'ai une table Employee comme celui-ciexport XML à partir du serveur SQL

EmpID, EmpName 

1 , hatem 

et j'écris une requête: select * from Employee for xml auto

de sorte que la sortie sera au format xml

Je veux une aide à savoir comment puis-je exporter le résultat dans un fichier xml à enregistrer sur mon ordinateur (HD) car j'ai besoin de lire les fichiers .xml de ce dossier et de les désérialiser dans mon application .net.

+0

Vous devez utiliser cette API: youtube.com/watch? v = hlY_PoJhlMk –

Répondre

14

Si vous avez seulement besoin de stocker les données XML et ne pas faire quoi que ce soit d'autre à celui-ci est sans doute la meilleure façon d'y arriver - en utilisant ADO.NET droite 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); 
} 

Cela va créer un fichier D:\test.xml (ou changer cela pour correspondre à votre système) et mettra ces balises XML dans ce fichier.

L'objet SqlCommand dispose également d'une méthode .ExecuteXmlReader() qui renvoie un objet XmlReader pour analyser et manipuler le code XML, et pas seulement pour renvoyer une chaîne. Utilisez ce qui vous semble le plus logique! PS: aussi, la sortie de FOR XML AUTO est un peu .... disons ... suboptimal. Il utilise le dbo.Employee comme balise XML principale et ainsi de suite ... avec SQL Server 2008, je vous recommande fortement d'utiliser FOR XML PATH à la place - il vous permet de modifier et de personnaliser la mise en page de la sortie XML.

Comparez votre sortie XML d'origine avec 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" /> 

contre cette requête - juste pour voir la différence:

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

sortie est:

<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

J'ai eu la même problème et j'ai créé un .NET CLR qui exporte XML dans un fichier:

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

Voici un exemple comment l'utiliser:

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

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

Et la sortie est un fichier XML bien formaté:

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