使用 WPF C# 将我的 SQL 数据库导出为 XML
Posted
技术标签:
【中文标题】使用 WPF C# 将我的 SQL 数据库导出为 XML【英文标题】:Export my SQL Database into an XML using WPF C# 【发布时间】:2021-09-04 02:18:27 【问题描述】:我想使用我的 WPF C# 应用程序代码导出数据库并将其保存在 XML 文件中。这是我正在使用的代码。
private void btnSave_Click(object sender, RoutedEventArgs e)
string FILENAME = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Connection.xml");
XDocument xdoc = XDocument.Load(FILENAME);
string conn = xdoc.Descendants("connectionStrings").FirstOrDefault().Value;
string query = "SELECT TOP 1000 [EMPID], [EMPName], [EMPRole], [EMPAddress], [EMPEmail], [EMPNumber] FROM [Login].[dbo].[tblEMP1] FOR XML PATH('ry'), ROOT('ty') ";
using (SqlConnection sqlCon = new SqlConnection(conn))
using (SqlCommand sqlCmd = new SqlCommand(query, sqlCon))
sqlCon.Open();
string result = sqlCmd.ExecuteScalar().ToString();
MessageBox.Show("XML Saved");
sqlCon.Close();
File.WriteAllText(@"C:\Users\user12\Desktop\test3.xml", result);
问题是它没有像我想要的那样显示 xml 标签,例如 <ty>,<ry>,<EMPID>,<EMPName>
等不出现。 XML 在 Microsoft SQL Server Management Studio 上运行良好。这是我在 Microsoft SQL Server Management Studio 上运行 XML 时的样子。
<ty>
<ry>
<EMPID>1</EMPID>
<EMPName>Thabo</EMPName>
<EMPRole>Developer </EMPRole>
<EMPAddress>227 Complex B WoodMans Road Claremont</EMPAddress>
<EMPEmail>Thabecoo@hotmail.com</EMPEmail>
<EMPNumber>083 577 8910</EMPNumber>
</ry>
<ry>
<EMPID>2</EMPID>
<EMPName>Aldrin</EMPName>
<EMPRole>Analyst </EMPRole>
<EMPAddress>65 Mfecane Avenue</EMPAddress>
<EMPEmail>AGFFHH@tommail.com</EMPEmail>
<EMPNumber>0872343352</EMPNumber>
</ry>
<ry>
<EMPID>4</EMPID>
<EMPName>Amoleng</EMPName>
<EMPRole>Engineer </EMPRole>
<EMPAddress>43 Pixely KaSeme Street</EMPAddress>
<EMPEmail>AmoT@axxess.co.za</EMPEmail>
<EMPNumber>0765546832</EMPNumber>
</ry>
</ty>
但是当我在 Visual Studio 上使用我的应用程序时保存它。这是我得到的结果(使用浏览器作为 XML 打开时):
1ThaboDeveloper 227 Complex B WoodMans Road ClaremontThabecoo@hotmail.com083 577 89102AldrinAnalyst 65 Mfecane AvenueAGFFHH@tommail.com08723433524AmolengEngineer 43 Pixely KaSeme StreetAmoT@axxess.co.za07655468325
如您所见,所有内容都聚集在一起,没有标签
当我用记事本打开它时会发生这种情况;
<ty><ry><EMPID>1</EMPID><EMPName>Thabo</EMPName><EMPRole>Developer </EMPRole><EMPAddress>227 Complex B WoodMans Road Claremont</EMPAddress><EMPEmail>Thabecoo@hotmail.com</EMPEmail><EMPNumber>083 577 8910</EMPNumber></ry><ry><EMPID>2</EMPID><EMPName>Aldrin</EMPName><EMPRole>Analyst </EMPRole><EMPAddress>65 Mfecane Avenue</EMPAddress><EMPEmail>AGFFHH@tommail.com</EMPEmail><EMPNumber>0872343352</EMPNumber></ry><ry><EMPID>4</EMPID><EMPName>Amoleng</EMPName><EMPRole>Engineer </EMPRole><EMPAddress>43 Pixely KaSeme Street</EMPAddress><EMPEmail>AmoT@axxess.co.za</EMPEmail><EMPNumber>0765546832</EMPNumber></ry>
正如你所看到的,标签现在出现了,但它仍然是聚集的。
我的目标是制作一个无需额外操作和编辑即可使用的 XML,并且我希望标签始终以正确的布局出现,就像在 SQL Server Management Studio 示例中那样。
提前致谢。
【问题讨论】:
您是否尝试过在另一个程序中读取/处理 Xml 文件,它是否会出错?从我可以看到记事本输出很好,格式取决于您使用的编辑器,对大多数解析器无关紧要。 ExecuteScalar 是该查询的错误方法。见docs.microsoft.com/en-us/dotnet/api/… 问题可能出在记事本上。微软最近更新了记事本以支持 linux。自此更新以来,我得到了与您相同的结果。我尝试了补丁,但它没有工作。请参阅:devblogs.microsoft.com/commandline/extended-eol-in-notepad 【参考方案1】:请尝试以下解决方案。
c#
void Main()
const string OUTFILENAME = @"C:\Users\user12\Desktop\test3.xml";
try
string FILENAME = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Connection.xml");
XDocument xdoc = XDocument.Load(FILENAME);
string conn = xdoc.Descendants("connectionStrings").FirstOrDefault().Value;
using (SqlConnection con = new SqlConnection(conn))
using (SqlCommand cmd = new SqlCommand())
// dynamic SQL
cmd.Connection = con;
cmd.CommandType = CommandType.Text;
cmd.CommandText = "SELECT TOP 1000 [EMPID], [EMPName], [EMPRole], [EMPAddress], [EMPEmail], [EMPNumber] FROM [Login].[dbo].[tblEMP1] FOR XML PATH('ry'), TYPE, ROOT('ty')";
con.Open();
using (XmlReader reader = cmd.ExecuteXmlReader())
XDocument xdocoutput = XDocument.Load(reader);
var settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = false;
settings.IndentChars = "\t";
// to remove BOM
settings.Encoding = new UTF8Encoding(false);
using (var writer = XmlWriter.Create(OUTFILENAME, settings))
xdocoutput.Save(writer);
Console.WriteLine("File '0' has been created.", OUTFILENAME);
catch (Exception ex)
Console.WriteLine("Connection failed with the following exception...");
Console.WriteLine(ex.Message.ToString());
【讨论】:
这段代码有效。希望它能处理更大的 XML 【参考方案2】:如果您查看原始 xml(使用记事本打开时),您缺少一个结束 </ty>
标记
<ty>
<ry>[snipped content]</ry>
<ry>[snipped content]</ry>
没有关闭 </ty>
标记,这就是浏览器将其呈现为单行的原因,并非所有浏览器都这样做,一些(chrome)会给你错误提示:
检查您是否从 sqlCmd.ExecuteScalar().ToString(); 返回此结束标记;或不。它在某处被截断/删除(假设您的记事本复制/粘贴是准确的)
【讨论】:
看来我的方法是剪切一些 xml以上是关于使用 WPF C# 将我的 SQL 数据库导出为 XML的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Angular 2 将我的 json 数据导出为 pdf、excel