通过 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# 来完成。该数据库具有完全相同的列,例如<EMPID>
和<EMPName>
。我希望它获取 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 文件的元素?