【问题标题】:C# - Update SQL table with data from XML fileC# - 使用 XML 文件中的数据更新 SQL 表
【发布时间】: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 文件中的每一行连接和断开一次。

标签: c# sql-server 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();
    }
}

【讨论】:

  • 很好的解决方案和解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
相关资源
最近更新 更多