繁体   English   中英

使用C#将XML文件加载到SQL Server表中

[英]Load XML file into SQL Server tables using C#

我有一个复杂的XML文件,它是从VB6中的旧程序导出的,现在我必须用C#编写一个程序,以将该XML文件加载到2个表中。 这是XML文件结构:

<?xml version="1.0" encoding="SHIFT-JIS" standalone="yes"?>
<AdminFile>
    <PO_No></PO_No>
    <Database>
        <PO>
            <Table_PO_Master>
                <DATA>
                    <PO_No></PO_No>
                    <PO_Date></PO_Date>
                </DATA>             
            </Table_PO_Master>
            <Table_PO_Details>
                <DATA>
                    <PO_No></PO_No>
                    <GOODS_CD></GOODS_CD>
                    <QTY></QTY>
                </DATA>             
            </Table_PO_Details>
        </PO>
    </Database>
</AdminFile>

我需要将此XML加载到2个具有以下结构的SQL Server表中:

Table_PO_Master(Id,PO_No,PO_Date)

Table_PO_Details(PO_No,GOODS_CD,QTY)

我在Google上搜索并找到了此代码,但不知道要在我的情况下应用它。

string myXMLfile = "D:\\MyXML.xml";
XmlTextReader textReader = new XmlTextReader(myXMLfile);
                XmlDocument doc = new XmlDocument();
                doc.Load(myXMLfile);
                XmlNodeList List = doc.GetElementsByTagName("RWResponse");

                foreach (XmlNode node in List)
                {
                    XmlNode Element = (XmlNode)node;
                    foreach (XmlNode node1 in Element)
                    {
                        XmlNode Element1 = (XmlNode)node1;
                        foreach (XmlNode node2 in Element1)
                        {
                            XmlNode Element2 = (XmlNode)node2;
                            foreach (XmlNode node3 in Element2)
                            {
                                XmlNode Element3 = (XmlNode)node3;
                                if (Element3.Name.ToUpper() != "HEADER")
                                {
                                    if (!Element3.OuterXml.ToString().Contains("ROW type=\"subtotal\""))
                                    {
                                        if (!Element3.OuterXml.ToString().Contains("ROW type=\"total\""))
                                        {
                                            DataRow dr = ret_XML_Data_in_DataTable.NewRow();                                           
                                            foreach (XmlNode node4 in Element3)
                                            {
                                                XmlElement Element4 = (XmlElement)node4;

                                            }
                                         }
                                    }
                                }
                            }
                        }
                    }
                }
            }

如果您想通过SP保存数据,而不需要在c#应用程序中加载xml,

使用ado.net将xml作为存储过程参数传递,

之后您可以提取xml并插入数据

所以你的SP就像

CREATE PROCEDURE [dbo].[InsertData]
@xml XML
AS
BEGIN

INSERT INTO Table_PO_Master
      SELECT
      PO_Master.value('(PO_No/text())[1]','VARCHAR(100)') AS PO_No, --TAG
      PO_Master.value('(PO_Date/text())[1]','VARCHAR(100)') AS PO_Date --TAG
      FROM
      @xml.nodes('/AdminFile/Database/PO/Table_PO_Master/Data')AS TEMPTABLE(PO_Master)

INSERT INTO Table_PO_Details
      SELECT
      PO_Master.value('(PO_No/text())[1]','VARCHAR(100)') AS PO_No, --TAG
      PO_Master.value('(GOODS_CD/text())[1]','VARCHAR(100)') AS GOODS_CD --TAG
      PO_Master.value('(QTY/text())[1]','int') AS QTY --TAG
      FROM
      @xml.nodes('/AdminFile/Database/PO/Table_PO_Details/Data')AS TEMPTABLE(PO_Details)
End

您还可以使用XDocument:

var doc = XDocument.Parse(xml);
foreach (XElement xe in doc.Descendants("Table_PO_Master"))
{    
    var PO_No = xe.Element("DATA").Element("PO_No").Value;
    var PO_Date = xe.Element("DATA").Element("PO_Date").Value;
    SaveIntoMaster(PO_No, PO_Date);
}

并对Table_PO_Details执行相同的操作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM