通过 C# WPF App 使用 XML 更新并插入 SQL Server 数据库

Posted

技术标签:

【中文标题】通过 C# WPF App 使用 XML 更新并插入 SQL Server 数据库【英文标题】:Update and Insert into SQL Server database using XML via C# WPF App 【发布时间】:2021-09-06 00:24:06 【问题描述】:

我要使用下面的 XML 文件;

<?xml version="1.0" encoding="UTF-8"?>

-<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>

-<ry>
<EMPID>5</EMPID>
<EMPName>Nathi</EMPName>
<EMPRole>Executive </EMPRole>
<EMPAddress>54 Steve Biko Road</EMPAddress>
<EMPEmail>nat544787@gmail.com</EMPEmail>
<EMPNumber>0834567656</EMPNumber>
</ry>
</ty>

我想使用这个名为 Oldtable.xml 的 XML 来更新名为 tblemp 的 SQL 数据库表。我正在使用 WPF 应用程序,我希望它使用 C# 来完成。该数据库具有完全相同的列,例如&lt;EMPID&gt;&lt;EMPName&gt;。我希望它获取 XML 数据并相应地更新现有条目(如果有新条目,它必须添加它)。或者,如果将tblemp 转换为 XML 文件并更新新的 XML 文件并让应用程序读取新的 XML 更简单,我愿意这样做。提前致谢。 这是我迄今为止尝试过的

void main()

    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())
    
        cmd.Connection = con;
        cmd.CommandType = CommandType.Text;

        cmd.CommandText = " INSERT INTO [dbo].[tblEMP] SELECT * FROM [dbo].[tblEMP1] WHERE [EMPID]=[EMPID] ";

        XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load(@"C:\Users\user1\Desktop\Oldtable.xml");

        var attributeName = "EMPID";
        var element = xdoc.Descendants("ry").FirstOrDefault(el => el.Attribute(attributeName) != null);
    

这就是我目前的方式,但我不确定如何构造 SQL 语句,因为我是新手。

请帮助我更好地构建 C# 代码。

为了进一步解释,Oldtable.xml 是上面数据的 xml,Connection.xml 是我用来连接 SQL Server 2014 Management Studio 中的 SQL Server 数据库的 xml

【问题讨论】:

您的问题是如何提取数据或如何更新数据库?大不同。 最好将整个 XML 作为参数传递给存储过程 (SP)。该 SP 将粉碎 XML 并使用 MERGE 插入/更新现有的数据库表。 @mm8 是如何更新数据库的。 【参考方案1】:

尝试以下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Data;

namespace ConsoleApplication193

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        const string Path = "Enter your path here";
        static void Main(string[] args)
        
            //string FILENAME = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Connection.xml");
            XDocument xdoc = XDocument.Load(FILENAME);
            using (SqlConnection con = new SqlConnection("Add your connection string here"))
            
                using (SqlCommand cmd = new SqlCommand())
                
                    cmd.Connection = con;
                    cmd.CommandType = CommandType.Text;
                    cmd.CommandText = " INSERT INTO [dbo].[tblEMP] (EMPID, EMPName, EMPRole, EMPAddress, EMPMail, EMPNumber) VALUES (@EMPID, @EMPName, @EMPRole, @EMPAddress, @EMPMail, @EMPNumber)";
                    cmd.Parameters.Add("@EMPID", SqlDbType.NVarChar);
                    cmd.Parameters.Add("@EMPName", SqlDbType.NVarChar);
                    cmd.Parameters.Add("@EMPRole", SqlDbType.NVarChar);
                    cmd.Parameters.Add("@EMPAddress", SqlDbType.NVarChar);
                    cmd.Parameters.Add("@EMPMail", SqlDbType.NVarChar);
                    cmd.Parameters.Add("@EMPNumber", SqlDbType.NVarChar);
                   
                    foreach (XElement ry in xdoc.Descendants("ry"))
                    
                        string empId = (string)ry.Element("EMPID");
                        string empName = (string)ry.Element("EMPName");
                        string empRole = (string)ry.Element("EMPRole");
                        string empAddress = (string)ry.Element("EMPAddress");
                        string empEmail = (string)ry.Element("Email");
                        string empNumber = (string)ry.Element("EMPNumber");

                        cmd.Parameters["@EMPID"].Value = empId;
                        cmd.Parameters["@EMPName"].Value = empName;
                        cmd.Parameters["@EMPRole"].Value = empRole;
                        cmd.Parameters["@EMPAddress"].Value = empAddress;
                        cmd.Parameters["@EMPMail"].Value = empEmail;
                        cmd.Parameters["@EMPNumber"].Value = empNumber;
 
                        cmd.ExecuteNonQuery();

                    
                
            
 
        
    


【讨论】:

【参考方案2】:

您实际上可以将整个 XML 传递给服务器,并使用 .nodes 函数在 SQL 中将其分解。

这消除了在 C# 端循环的需要,并且可能会执行得更好。

请更正列的数据类型,因为我无权访问您的架构

void main()

    string FILENAME = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Connection.xml");

    XDocument xdoc = XDocument.Load(FILENAME);
    string connStr = xdoc.Descendants("connectionStrings").FirstOrDefault().Value;

    const string query = @"
INSERT INTO [dbo].[tblEMP]
    (EMPID, EMPName, EMPRole, EMPAddress, EMPMail, EMPNumber)
SELECT
    x.ry.value('EMPID', 'int'),
    x.ry.value('EMPName', 'nvarchar(100)'),
    x.ry.value('EMPRole', 'nvarchar(100)'),
    x.ry.value('EMPAddress', 'nvarchar(1000)'),
    x.ry.value('EMPMail', 'nvarchar(200)'),
    x.ry.value('EMPNumber', 'nvarchar(100)')
FROM @xml.nodes('/ty/ry') x(ry);
";

    using (SqlConnection con = new SqlConnection(connStr))
    using (SqlCommand cmd = new SqlCommand(query, con))
    
        cmd.Parameters.Add("@xml", SqlDbType.Xml).Value =
            new SqlXml(new XmlTextReader(@"C:\Users\user1\Desktop\Oldtable.xml")));
        con.Open();
        cmd.ExecuteNonQuery();
    

【讨论】:

以上是关于通过 C# WPF App 使用 XML 更新并插入 SQL Server 数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c# Windows 8 App 中更新现有 XML 文件的元素?

wpf c# xml修改的方法

c# - 在运行时更改 App.Config 后,实体框架 ConnectionString 不会更新

使用 WPF C# 将我的 SQL 数据库导出为 XML

WPF C# 应用程序在安装更新时更新实体框架

解析字符串 XML C# WPF