使用 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(使用记事本打开时),您缺少一个结束 &lt;/ty&gt; 标记

<ty>
<ry>[snipped content]</ry>
<ry>[snipped content]</ry>

没有关闭 &lt;/ty&gt; 标记,这就是浏览器将其呈现为单行的原因,并非所有浏览器都这样做,一些(chrome)会给你错误提示:

检查您是否从 sqlCmd.ExecuteScalar().ToString(); 返回此结束标记;或不。它在某处被截断/删除(假设您的记事本复制/粘贴是准确的)

【讨论】:

看来我的方法是剪切一些 xml

以上是关于使用 WPF C# 将我的 SQL 数据库导出为 XML的主要内容,如果未能解决你的问题,请参考以下文章

为导出 SQL 的 hsqldb 创建 ER 图

如何使用 Angular 2 将我的 json 数据导出为 pdf、excel

为啥 WPF 将我的数据上下文设置为 MS.Internal.NamedObject?

如何在wpf c#中从数据表导出到excel文件

从 CLI C++ 应用程序在库中加载 C# WPF 表单

SQL Server CE:到同一个数据库(C#,WPF)的多个连接(2+ 应用程序)