C#-使用XML文件中的数据更新SQL表

C#-使用XML文件中的数据更新SQL表,c#,sql-server,xml,C#,Sql Server,Xml,我正在尝试使用C#从XML文件中读取数据,并使用更新我的SQL表。 但什么也没发生 我的XML是这样的 <User> <Table> <userID>535631</userID> <Date>2017-12-18</Date> </Table> <Table> <userID>36334</userID> <Date>2

我正在尝试使用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>
有什么建议我做错了什么吗?我可以打印日期和用户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();
                }
            }

您的代码中有几处错误

  • 您应该始终使用SQL参数,而不是将值烘焙到SQL字符串中。这是非常重要的。像您这样构建SQL字符串会造成安全漏洞
  • 你真的应该把你的
    SqlConnection
    和你的
    SqlCommand
    包装进去。数据库连接是您希望在使用完后立即释放的资源
  • 除非您使用的是
    DataSet
    DataTable
    类,否则不应使用
    SqlDataAdapter
    。您没有在代码中这样做,也没有理由这样做
  • 您真的不应该在循环中关闭数据库连接。然后,当您试图处理XML文件中的第二个“table”元素时,连接将关闭
修复此问题后,更新循环可能如下所示:

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();
    }
}

您的代码中有几处错误

  • 您应该始终使用SQL参数,而不是将值烘焙到SQL字符串中。这是非常重要的。像您这样构建SQL字符串会造成安全漏洞
  • 你真的应该把你的
    SqlConnection
    和你的
    SqlCommand
    包装进去。数据库连接是您希望在使用完后立即释放的资源
  • 除非您使用的是
    DataSet
    DataTable
    类,否则不应使用
    SqlDataAdapter
    。您没有在代码中这样做,也没有理由这样做
  • 您真的不应该在循环中关闭数据库连接。然后,当您试图处理XML文件中的第二个“table”元素时,连接将关闭
修复此问题后,更新循环可能如下所示:

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();
    }
}

您正在使用的是select命令,而不是update命令。Arh OK。。非常感谢。我将尝试使用cmd.CommandText。。或者有更好的办法吗?是的,使用
CommandText
和参数,而不是信任用户输入,因为这会使您容易受到sql注入的攻击。对您的解决方案的评论:使用(连接的)将最外层的
移动到循环之外。和
Open()
循环之前的连接。只连接一次。如果在循环内创建并关闭连接,则将为XML文件中的每一行连接和断开连接一次。您使用的是select命令,而不是update命令。Arh OK。。非常感谢。我将尝试使用cmd.CommandText。。或者有更好的办法吗?是的,使用
CommandText
和参数,而不是信任用户输入,因为这会使您容易受到sql注入的攻击。对您的解决方案的评论:使用
(连接的)将最外层的
移动到循环之外。和
Open()
循环之前的连接。只连接一次。如果在循环中创建并关闭连接,那么XML文件中的每一行都将连接和断开连接一次。好的解决方案和解释。好的解决方案和解释。