C#-使用XML文件中的数据更新SQL表
我正在尝试使用C#从XML文件中读取数据,并使用更新我的SQL表。 但什么也没发生 我的XML是这样的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
<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文件中的每一行都将连接和断开连接一次。好的解决方案和解释。好的解决方案和解释。