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 中。数据库连接是您希望在完成后立即释放的资源。 除非您正在使用DataSetDataTable 类,否则不应使用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 表的主要内容,如果未能解决你的问题,请参考以下文章

3 尝试使用 C# 删除 XML 节点

当数据集WriteXml()函数生成xml文件时,C#如何使用XDocument类更新xml文件

带有 XML 数据库字段的 Linq-to-SQL —— 为啥会这样?

如何在 C# 控制台应用程序中使用 XmlTextReader 将 XML 数据插入 SQL Server 表?

c# LINQ-to-XML 更新(保存)排序后文件中的元素列表

使用 C# 将 FileHelpers 数据排序到 SQl 服务器中的不同列中