【问题标题】:Format XML Returned from SQL Server从 SQL Server 返回的 XML 格式
【发布时间】:2015-06-02 19:10:18
【问题描述】:

我有一个用 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 文件中。

【问题讨论】:

  • reader.Getstring(0) 在运行时的调试预览中是否返回正确的结果
  • 这甚至不是 VB 语法,而是 C#!
  • @har07 是的,抱歉,我的意思是说我正在使用 Visual Studio 编写 C#。这是漫长的一天。
  • @BrandonLumsden 没问题,只要你澄清一下

标签: c# sql-server xml


【解决方案1】:

以下代码解决了您的原始代码和您的答案的几个问题:

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

首先,SqlConnectionSqlCommandXmlReaderStreamWriter 都需要在 using 块中,以确保它们被清理,即使抛出异常也是如此。

其次,DataSet 无法处理所有可能的 XML 文档。它只能处理那些可以表示为“关系”表的表。当您只想解析 XML 时,构建表和列也是不必要的开销。我改用XDocument

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

【讨论】:

  • 在 Visual Basic 中 using 语句的功能是否类似于 try...catch?谢谢你的解释。另外,您是说查询生成的 Xml 会在某个时候发生变化并因此变得无法被数据集读取?
  • 使用语句类似于Try ... Finally x.Dispose() End Try。他们确保对子句中表达式中的值调用Dispose
  • 哦,好吧,Dispose() 正在完成我最初在我的代码中的 reader.Close()conn.Close() 的工作。 using 语句自行调用 Dispose(),而无需我调用 close 方法。至少这是我从你的帖子中收集到的。信息量很大!
【解决方案2】:

【讨论】:

  • 所以我会这样做:SqlXml xmlData = reader.GetSqlXml(0); Console.WriteLine(xmlData); 还是会有所不同?
  • 我尝试使用该链接中的所有建议,但没有任何效果。我在这条线上一直收到错误SqlXml xmldata = reader.GetSqlXml(0); 无法将“System.Data.SqlTypes.SqlString”类型的对象转换为“System.Data.SqlClient.SqlCachedBuffer”类型。
【解决方案3】:

我遇到了一个解决方案,这是我将其更改为的代码:

        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() 正在逐行读取文件并将其写入文件。

【讨论】:

  • 这在一般情况下不是一个好的解决方案。 DataSet.ReadXml 无法读取每个 XML 文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 2023-03-03
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多