C# - 使用 XML 文件中的数据更新 SQL 表
Posted
技术标签:
【中文标题】C# - 使用 XML 文件中的数据更新 SQL 表【英文标题】:C# - Update SQL table with data from XML file 【发布时间】:2020-07-07 00:57:10 【问题描述】:我正在尝试使用 C# 从 XML 文件中读取数据,并更新我的 SQL 表。 但什么也没有发生。
我的 XML 看起来像这样
<User>
<Table>
<userID>535631</userID>
<Date>2017-12-18</Date>
</Table>
<Table>
<userID>36334</userID>
<Date>2020-02-03</Date>
</Table>
<Table>
<userID>734563</userID>
<Date>2020-02-03</Date>
</Table>
<Table>
<userID>6334</userID>
<Date>2020-02-21</Date>
</Table>
</User>
我尝试了什么:
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\\temp\\data\\myData.xml");
XmlNodeList node = doc.SelectNodes("/User/Table");
string source = ConfigurationManager.ConnectionStrings["JBVRM"].ConnectionString;
SqlConnection conn = new SqlConnection(source);
SqlCommand cmd = new SqlCommand();
foreach (XmlNode xn in node)
string userID = xn["userID"].InnerText;
string NewDate= xn["Date"].InnerText;
SqlDataAdapter mysqlDataAdapter = new SqlDataAdapter("UPDATE [dbo].[User] SET Date='"+NewDate+"' WHERE UserID="+ userID , source);
conn.Close();
// Console.WriteLine(userID+" "+Date); // This prints everything very fine.
任何建议我做错了什么?我可以打印日期和用户 ID fint。但我的表没有更新。
解决方案感谢@Magnetron 和@Gnud
using (SqlConnection connection = new SqlConnection(source))
using (SqlCommand cmd = connection.CreateCommand())
cmd.CommandText = "UPDATE [dbo].[User] SET Date=@Date WHERE userID=@userID";
cmd.Parameters.AddWithValue("@Date", xn["Date"].InnerText);
cmd.Parameters.AddWithValue("@userID", xn["userID"].InnerText);
cmd.Connection.Open();
cmd.ExecuteNonQuery();
【问题讨论】:
SqlAdapter
Constructor,您使用的是选择命令而不是更新命令。
嗯好的..谢谢。我会尝试使用 cmd.CommandText.. 还是有更好的主意?
是的,使用 CommandText
和参数,而不是信任用户输入,因为这会使您容易受到 sql 注入的攻击。
评论您的解决方案:将最外面的using
(连接的)移到循环之外。和Open()
循环前的连接。只连接一次。如果您在循环内创建和关闭连接,您将为 XML 文件中的每一行连接和断开一次。
【参考方案1】:
您的代码中有几处错误。
您应该始终使用 SQL 参数,而不是将值烘焙到 SQL 字符串中。这是重要的。像您这样构建 SQL 字符串会导致安全漏洞。 你真的应该把你的SqlConnection
和你的SqlCommand
包裹在using
statements 中。数据库连接是您希望在完成后立即释放的资源。
除非您正在使用DataSet
或DataTable
类,否则不应使用SqlDataAdapter
。您没有在代码中这样做,也没有理由这样做。
您真的不应该在循环内关闭数据库连接。然后,当您尝试处理 XML 文件中的第二个“表”元素时,连接将被关闭。
修复此问题后,更新循环可能如下所示:
using(var conn = new SqlConnection(source))
using(var cmd = conn.CreateCommand())
conn.Open();
cmd.CommandText = "UPDATE [dbo].[User] SET [Date]=@date WHERE [UserId]=@id";
cmd.Prepare();
var date = cmd.CreateParameter();
date.ParameterName = "@date";
date.DbType = DbType.Date;
var id = cmd.CreateParameter();
id.ParameterName = "@id";
id.DbType = DbType.Int32;
cmd.Parameters.Add(date);
cmd.Parameters.Add(id);
foreach (XmlNode xn in node)
id.Value = int.Parse(xn["userID"].InnerText);
date.Value = DateTime.ParseExact(xn["Date"].InnerText, "yyyy-MM-dd", CultureInfo.InvariantCulture);
cmd.ExecuteNonQuery();
【讨论】:
很好的解决方案和解释。以上是关于C# - 使用 XML 文件中的数据更新 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章
当数据集WriteXml()函数生成xml文件时,C#如何使用XDocument类更新xml文件
带有 XML 数据库字段的 Linq-to-SQL —— 为啥会这样?
如何在 C# 控制台应用程序中使用 XmlTextReader 将 XML 数据插入 SQL Server 表?