从SQL Server返回的XML格式

本文关键字:XML 格式 返回 SQL Server | 更新日期: 2023-09-27 17:52:54

我有一个用Visual Studio编写的程序。下面是代码:

namespace SQL_Connectivity
{
   class Program
   {
       static void Main(string[] args)
       {
           SqlConnection conn = new SqlConnection("Server=************.database.windows.net,0000;Database=testdb;User ID=testuser;Password= testpassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;");
        conn.Open();
           SqlCommand cmd = new SqlCommand("SELECT * FROM District WHERE leaID <= 4 FOR XML PATH('districtEntry'), ROOT('districts')", conn);
           SqlDataReader reader = cmd.ExecuteReader();
           string path = @"District." + DateTime.Now.ToString("yyyyMMdd") + ".xml";
           var writer = new StreamWriter(path);
           while(reader.Read())
           {
               Console.SetOut(writer);
               Console.WriteLine(reader.GetString(0));
           }
           reader.Close();
           conn.Close();
       }
   }
}

假设SqlConnection字符串有效。查询继续查询数据库,并以完美的格式返回结果。然而,当它经过我的代码时,它被保存在一个XML文件中,如下所示:

<districts><districtEntry><leaID>01</leaID><name>Alachua</name>    <organizationType>LEA</organizationType><streetLine1>620 E University     Ave</streetLine1><city>Gainesville</city><stateProvince>FL</stateProvince><postalCode>326015448</postalCode><county>Alachua</county><NCESID_district>1200030</NCESID_district><date_created>2015-06-01T20:38:58.9730000</date_created><date_updated>2015-06-01T20:38:58.9730000</date_updated></districtEntry><districtEntry><leaID>02</leaID><name>Baker</name><organizationType>LEA</organizationType><streetLine1>270 South Blvd E</streetLine1><city>MacClenny</city><stateProvince>FL</stateProvince><postalCode>320632538</postalCode><county>Baker</county><NCESID_district>1200060</NCESID_district><date_created>2015-06-01T20:38:58.9730000</date_created><date_updated>2015-06-01T20:38:58.9730000</date_updated></districtEntry><districtEntry><leaID>03</leaID><name>Bay</name><organizationType>LEA</organizationType><streetLine1>1311 Balboa Ave</streetLine1><city>Panama City</city><stateProvince>FL</st

这一切都结束在一行,我的代码没有完成XML文件(在末尾缺少数据)。它似乎总是停在表中最后一行之前。我也尝试过这与多个表。

我在问是否有一种方法

  1. 格式化我的XML文件,使它好看&
  2. 调整我的代码,使查询的结果完全保存在XML文件中。

从SQL Server返回的XML格式

下面的代码用你的原始代码和答案解决了几个问题:

private static void Main(string[] args)
{
    using (
        var conn =
            new SqlConnection(
                "Server=************.database.windows.net,0000;Database=testdb;User ID=testuser;Password= testpassword;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;")
        )
    {
        conn.Open();
        using (
            var cmd =
                new SqlCommand(
                    "SELECT * FROM District WHERE leaID <= 4 FOR XML PATH('districtEntry'), ROOT('districts')",
                    conn))
        {
            using (var reader = cmd.ExecuteXmlReader())
            {
                var doc = XDocument.Load(reader);
                string path = @"District." + DateTime.Now.ToString("yyyyMMdd") + ".xml";
                using (var writer = new StreamWriter(path))
                {
                    doc.Save(writer);
                }
            }
        }
    }
}

首先,SqlConnection, SqlCommand, XmlReaderStreamWriter都需要在using块中,以确保它们被清理,即使抛出异常。

第二,DataSet不能处理所有可能的XML文档。它只能处理那些可以表示为"关系"表的数据。当您只想解析XML时,构建表和列也是不必要的开销。我用XDocument代替。

最后,XDocument.Save方法写出缩进的XML。

必须使用reader。GetSqlXml来获取结果。看一看SQL Server XML数据类型在。net中转换为什么?如何将其转换为XmlDocument?

我遇到了一个解决方案&下面是我修改后的代码:

        SqlCommand cmd = new SqlCommand("SELECT * FROM District FOR XML PATH('districtEntry'), ROOT('districts')", conn);
        string path = @"District." + DateTime.Now.ToString("yyyyMMdd") + ".xml";
        XmlReader reader = cmd.ExecuteXmlReader();
        var data = new DataSet();
        data.ReadXml(reader);
        data.WriteXml(path);

我了解到reader.Read()正在逐行读取文件并将其写入文件。