【问题标题】:Efficient way to export database tables to XML file in c#.net在 c#.net 中将数据库表导出到 XML 文件的有效方法
【发布时间】:2014-02-04 08:24:31
【问题描述】:

我有一个包含 7 个表的 sqlite 数据库。我需要将它们导出到 c#.net 中的 XML 文件。 这样做时,我使用了 7 个嵌套循环来访问 7 个数据表的数据,以维护列的依赖关系。但是当我运行它时,我的机器变得非常慢。它会生成 XML 文件,但生成的 XML 会在一段时间后发生变化。似乎,在每次迭代中,它都会生成一个 XML 并用新的替换它。我的代码如下:

public XMLSerializer(String filepath,ROOT root)
            {               


                XmlDocument doc = new XmlDocument();
                XmlNode rootNode, aNode, pNode, eNode, mNode, plNode;

                // Create a procesing instruction.
                XmlProcessingInstruction newPI;


                String PItext = "type='text/xsl' href='root.xsl'";
                newPI = doc.CreateProcessingInstruction("xml-stylesheet", PItext);

                // Add the processing instruction node to the document.
                doc.AppendChild(newPI);

                rootNode = doc.CreateElement("root");
                doc.AppendChild(rootNode);    


                plNode = doc.CreateElement("pl");
                rootNode.AppendChild(plNode);

                eNode = doc.CreateElement("e");
                rootNode.AppendChild(eNode);

                mNode = doc.CreateElement("m");
                rootNode.AppendChild(mNode);

                aNode = doc.CreateElement("a");
                rootNode.AppendChild(aNode);                 


                DataTable plDT = root.Getpl();

                foreach (DataRow pRow in plDT.Rows)
                {
                    XmlNode plNode = doc.CreateElement("p");

                    XmlNode pIDNode = doc.CreateElement("id");
                    XmlNode pteNode = doc.CreateElement("te");                    
                    XmlNode fNode = doc.CreateElement("fs");

                    plNode.AppendChild(pIDNode);
                    plNode.AppendChild(pteNode);                    
                    plNode.AppendChild(fNode);

                    plNode.AppendChild(plNode);

                    pIDNode.InnerText = pRow["id"].ToString();
                    pteNode.InnerText = root.Getpte(pRow["id"].ToString());

                    DataTable fmdt = root.GetFml(pRow["id"].ToString());
                    foreach (DataRow fmRow in fmdt.Rows)
                    {
                        XmlNode fsNode = doc.CreateElement("fm");

                        XmlNode fmIDNode = doc.CreateElement("id");
                        XmlNode fmpNode = doc.CreateElement("p");

                        XmlNode eNode = doc.CreateElement("e");                    

                        fsNode.AppendChild(fmIDNode);
                        fsNode.AppendChild(fmpNode);

                        fsNode.AppendChild(eNode);                           

                        plNode.AppendChild(fsNode);


                        fmIDNode.InnerText = fmRow["id"].ToString();
                        fmpNode.InnerText = pRow["id"].ToString();                      


                        DataTable eDT = root.Gete();

                        foreach (DataRow eRow in eDT.Rows)
                        {
                            XmlNode eNode = doc.CreateElement("e");

                            XmlNode eIDNode = doc.CreateElement("id");
                            XmlNode eDanNode = doc.CreateElement("dan");                            

                            XmlNode mNode = doc.CreateElement("m");    

                            eNode.AppendChild(eIDNode);
                            eNode.AppendChild(edanNode);                           

                            //eNode.AppendChild(eNode);
                            fsNode.AppendChild(eNode);

                            eIDNode.InnerText = eRow["id"].ToString();
                            edanNode.InnerText = root.Getedan(eRow["id"].ToString());                           


                            DataTable mDT = root.Getm();

                            foreach (DataRow mRow in mDT.Rows)
                            {
                                XmlNode mNode = doc.CreateElement("m");

                                XmlNode mIDNode = doc.CreateElement("id");
                                XmlNode meNode = doc.CreateElement("e");


                                mNode.AppendChild(mIDNode);
                                mNode.AppendChild(meNode);                                

                                eNode.AppendChild(mNode);

                                mIDNode.InnerText = mRow["id"].ToString();
                                meNode.InnerText = root.Getme(mRow["id"].ToString());                                

                                DataTable aDT = root.Geta();

                                foreach (DataRow aRow in aDT.Rows)
                                {
                                    XmlNode aNode = doc.CreateElement("a");

                                    XmlNode AssIDNode = doc.CreateElement("id");
                                    XmlNode AssNaNode = doc.CreateElement("na");

                                    XmlNode pinNode = doc.CreateElement("pin");

                                    aNode.AppendChild(AssIDNode);
                                    aNode.AppendChild(AssNaNode);

                                    aNode.AppendChild(pinNode);

                                    AssIDNode.InnerText = aRow["id"].ToString();
                                    AssNaNode.InnerText = aRow["na"].ToString();

                                    mNode.AppendChild(aNode);

                                    DataTable piDT = root.Getp(aRow["id"].ToString());

                                    foreach (DataRow piRow in piDT.Rows)
                                    {
                                        XmlNode pInNode = doc.CreateElement("pIn");

                                        XmlNode pInIDNode = doc.CreateElement("id");

                                        XmlNode pInaNode = doc.CreateElement("a");
                                        XmlNode pInpNode = doc.CreateElement("p");
                                        XmlNode pInFminNode = doc.CreateElement("fmin");

                                        pInNode.AppendChild(pInIDNode);                                       
                                        pInNode.AppendChild(pInaNode);
                                        pInNode.AppendChild(pInpNode);
                                        pInNode.AppendChild(pInFminNode);

                                        aNode.AppendChild(pInNode);       


                                        pInIDNode.InnerText = piRow["id"].ToString();                                       
                                        pInaNode.InnerText = aRow["id"].ToString();
                                        pInpNode.InnerText = pRow["id"].ToString();

                                        DataTable fmiDT = root.GetFmin(piRow["id"].ToString());
                                        foreach (DataRow fmiRow in fmiDT.Rows)
                                        {
                                            XmlNode fmInNode = doc.CreateElement("fmIn");

                                            XmlNode fmInIDNode = doc.CreateElement("id");
                                            XmlNode fmInpInNode = doc.CreateElement("pIn");
                                            XmlNode fmInFmNode = doc.CreateElement("fm");
                                            XmlNode fmIneNode = doc.CreateElement("e");
                                            XmlNode fmInmNode = doc.CreateElement("m");                                            

                                            fmInNode.AppendChild(fmInIDNode);
                                            fmInNode.AppendChild(fmInpInNode);
                                            fmInNode.AppendChild(fmInFmNode);
                                            fmInNode.AppendChild(fmIneNode);
                                            fmInNode.AppendChild(fmInmNode);                                            

                                            pInNode.AppendChild(fmInNode);

                                            fmInIDNode.InnerText = fmiRow["id"].ToString();
                                            fmInpInNode.InnerText = piRow["id"].ToString();
                                            fmInFmNode.InnerText = fmRow["id"].ToString();
                                            fmIneNode.InnerText = eRow["id"].ToString();
                                            fmInmNode.InnerText = mRow["id"].ToString();   


                                        }        

                                    }        

                                }
                            }
                        }             
                    }                       

              }

            doc.Save(filepath); 

            }       


        }       

    }     

我认为我的编码方式效率不高。谁能告诉我任何更好的访问数据表的方法?

【问题讨论】:

  • 如果您注意到代码,我使用了 7 个嵌套循环。使用7个循环是否正常?不同表的列之间存在依赖关系。为了保持这种依赖性,我使用了 7 个循环。你认为有没有更好的方法来访问数据表的数据?
  • 如前所述,通常使用 7 个嵌套的 foreach 循环吗?
  • 我认为这很不寻常,但如果您的要求同样不寻常(表中的每一行 f.e. plDT 都有一个相关表 fmdt??)
  • 其实plDT的“id”等于fmdt的“p”。如果我不将 fmdt 嵌套到 plDT 中,我将无法访问 plDT 的“id”。其他表的情况类似。这就是为什么,我已经嵌套了所有的循环,这样我就可以访问其他表的依赖列。有没有其他更好的方法来处理这种情况?

标签: c# xml sqlite loops datatable


【解决方案1】:

你可以简单地使用DataTable.WriteXml()

YourDataTable.WriteXml(strfilepath);

YourDataSet.WrteXml(strfilepath);

【讨论】:

  • 你的意思是,在最后一行? YourDataSet.WrteXml(strfilepath);而不是 doc.Save(filepath); ?实际上,如果您注意到代码,我已经使用了 7 个嵌套循环。效率高吗?你认为有没有更好的方法来访问数据表的数据?
  • 您是如何从数据库中获取数据的?如果您将它放入datasetdatatable,那么您可以使用WriteXml() 对其进行序列化
  • 实际上,我是一个新的 c# 程序员 :) 无论如何,如果你注意到代码,我正在使用 pteNode.InnerText = root.Getpte(pRow["id" ].ToString());还有另一个文件,我从中获取数据并将它们放入数据表中。现在我将尝试在最里面的循环中使用 WriteXml() 方法。但是 7 个循环呢?通常使用 7 个嵌套循环吗?
  • 我使用的是 WriteXml() 方法而不是 doc.Save(filepath);在最后一行代码中。但是,它没有保存文件。
  • 把datatable中的全部数据,一次性写入。
猜你喜欢
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多