2010-10-17 61 views
7

Hãy nói rằng tôi có một bảng Employee như thế nàyxuất khẩu xml từ máy chủ sql

EmpID, EmpName 

1 , hatem 

và tôi viết một truy vấn: select * from Employee for xml auto

do đó sản lượng sẽ ở định dạng xml

Tôi muốn có một số giúp đỡ để biết làm thế nào tôi có thể xuất kết quả cho một tập tin xml được lưu trên máy tính của tôi (HD) như tôi cần phải đọc các tập tin .xml từ thư mục này và deserialize chúng trong ứng dụng .net của tôi.

+0

Bạn nên sử dụng API này: youtube.com/watch? v = hlY_PoJhlMk –

Trả lời

14

Nếu bạn chỉ cần lưu trữ XML và không làm bất cứ điều gì khác với nó, điều này có lẽ là cách dễ nhất để thực hiện điều này - sử dụng ADO.NET thẳng đơn giản:

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

Điều này sẽ tạo ra một file D:\test.xml (hoặc thay đổi điều đó để phù hợp với hệ thống của bạn) và sẽ đưa các thẻ XML đó vào tệp đó.

Đối tượng SqlCommand cũng có phương thức .ExecuteXmlReader() sẽ trả về đối tượng XmlReader để quét và thao tác XML - không chỉ trả về một chuỗi. Sử dụng bất cứ điều gì làm cho ý nghĩa nhất đối với bạn!

PS: cũng vậy, đầu ra của FOR XML AUTO là một chút .... giả sử ... tối ưu. Nó sử dụng dbo.Employee vì đó là thẻ XML chính và vv ... với SQL Server 2008, tôi khuyên bạn nên xem xét sử dụng FOR XML PATH thay vào đó - nó cho phép bạn tinh chỉnh và tùy chỉnh bố cục của đầu ra XML.

Hãy so sánh đầu ra XML ban đầu của bạn với 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" /> 

chống lại truy vấn này - chỉ để thấy sự khác biệt:

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

Output là:

<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

Tôi đã có cùng một vấn đề và tôi đã tạo một NET CLR. Xuất XML thành một tệp:

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

Dưới đây là một ví dụ làm thế nào để sử dụng nó:

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

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

Và kết quả là một file XML định dạng đẹp:

<?xml version="1.0" encoding="utf-8"?> 
<Test> 
    <Something>1</Something> 
    <AnotherOne>2</AnotherOne> 
</Test> 
Các vấn đề liên quan