从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文件(在末尾缺少数据)。它似乎总是停在表中最后一行之前。我也尝试过这与多个表。
我在问是否有一种方法
- 格式化我的XML文件,使它好看&
- 调整我的代码,使查询的结果完全保存在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
, XmlReader
和StreamWriter
都需要在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()
正在逐行读取文件并将其写入文件。