2010-10-17 50 views
7

比方说,我有一个表Employee这样导出XML

EmpID, EmpName 

1 , hatem 

和我写的查询:select * from Employee for xml auto

所以输出将是XML格式的

我想要一些帮助知道如何将结果导出到xml文件以保存在我的计算机(HD)中,因为我需要从该文件夹读取.xml文件并在我的.net应用程序中反序列化它们。

+0

你应该使用这个API:youtube.com/watch? v = hlY_PoJhlMk – 2016-09-15 20:39:05

回答

14

如果你只需要存储的XML,而不是做别的事吧,这可能是实现这一目标的最简单的方法 - 使用简单的直ADO.NET:

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

这将创建一个文件D:\test.xml (或者改变它以匹配你的系统),并将这些XML标签放入该文件中。

SqlCommand对象还有一个.ExecuteXmlReader()方法,该方法将返回一个XmlReader对象来扫描和操作XML - 不只是返回一个字符串。使用任何对你最有意义的东西!

PS:另外,FOR XML AUTO的输出有点....比方说...不是最理想的。它使用dbo.Employee作为它的主要XML标签,等等...对于SQL Server 2008,我强烈建议您考虑使用FOR XML PATH来代替 - 它允许您调整和自定义XML输出的布局。

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" /> 

比较原始的XML输出与此查询 - 刚刚看到的区别:

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

输出是:

<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

我已经有同样的问题,我创建了一个将XML导出到文件的.NET CLR:

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

下面是一个例子如何使用它:

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

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

,输出是一个格式良好的XML文件:

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