2010-10-17 7 views
7

Sagen wir, ich habe eine Tabelle Employee wie dieseExport xml von SQL Server

EmpID, EmpName 

1 , hatem 

und ich schreibe eine Abfrage: select * from Employee for xml auto

so dass die Ausgabe im XML-Format sein wird

ich einige wollen Hilfe zu wissen, wie ich das Ergebnis in eine XML-Datei exportieren kann, um auf meinem Computer (HD) gespeichert zu werden, da ich die .xml-Dateien aus diesem Ordner lesen und in meiner .net-Anwendung deserialisieren muss.

+0

Sie sollten diese API verwenden: youtube.com/watch? v = hlY_PoJhlMk –

Antwort

14

Wenn Sie nur die XML speichern müssen und nichts anderes, es zu tun, dann ist dies wahrscheinlich der einfachste Weg, dies zu erreichen - gerade einfach ADO.NET mit:

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

Dadurch wird eine Datei erstellen D:\test.xml (oder ändern Sie das, um Ihrem System zu entsprechen) und werden diese XML-Umbauten in diese Akte setzen.

Das Objekt SqlCommand hat auch eine .ExecuteXmlReader() Methode, die ein XmlReader Objekt zurückgeben würde, um das XML zu scannen und zu manipulieren - nicht nur eine Zeichenkette zurückzugeben. Benutze, was dir am sinnvollsten ist!

PS: auch die Ausgabe von FOR XML AUTO ist ein bisschen .... sagen wir mal ... suboptimal. Es verwendet die dbo.Employee als Haupt-XML-Tag und so weiter ... mit SQL Server 2008 würde ich Ihnen dringend empfehlen, stattdessen FOR XML PATH zu verwenden - es ermöglicht Ihnen, das Layout der XML-Ausgabe zu optimieren und anzupassen.

Vergleichen Sie die ursprüngliche XML-Ausgabe mit 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" /> 

gegen diese Abfrage - nur um den Unterschied zu sehen:

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

Ausgang ist:

<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

ich je hatte die Gleiches Problem und ich habe eine .NET CLR erstellt, die XML in eine Datei exportiert:

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

Hier ist ein Beispiel wie man es benutzt:

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

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

Und der Ausgang ist eine schön formatierte XML-Datei:

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