C# “

C# “,c#,.net,sql,sql-update,sqlclient,C#,.net,Sql,Sql Update,Sqlclient,我从xml格式的数据库中获取字符串,并尝试使用以下查询更新xml: ExecuteNonQuery("Update Logs SET Message = " + encryptedMessage + " WHERE ID = " + message.Id); 但它给了我一个错误信息: “使用参数化查询和命令对象附近的语法不正确,加密消息可能包含破坏UPDATE语句语法的字符。使用参数化查询和命令对象,加密消息可能包含破坏UPDATE语句语法的字符。是,您似乎缺少消息周围的引号: Execute

我从xml格式的数据库中获取字符串,并尝试使用以下查询更新xml:

ExecuteNonQuery("Update Logs SET Message = " + encryptedMessage + " WHERE ID = " + message.Id);
但它给了我一个错误信息:


“使用参数化查询和命令对象附近的语法不正确,加密消息可能包含破坏UPDATE语句语法的字符。

使用参数化查询和命令对象,加密消息可能包含破坏UPDATE语句语法的字符。

是,您似乎缺少消息周围的引号:

ExecuteNonQuery("Update Logs SET Message = '" + encryptedMessage + "' WHERE ID = " + message.Id);

XML本身可能也有单引号,因此您可能需要转义这些引号,例如,将消息中的一个单引号更改为两个单引号

ExecuteNonQuery("Update Logs SET Message = '" + encryptedMessage + "' WHERE ID = " + message.Id);

XML本身可能也有单引号,因此您可能需要转义这些引号,例如,将消息中的一个单引号更改为两个单引号

,正如@Tomek所提到的,您应该使用参数化查询。它更安全,不需要进行@Dan Sueava回答中建议的转换

    SqlCommand command = 
     new SqlCommand("Update Logs SET Message = @EncryptedText WHERE ID = @MessageId");
    command.Parameters.AddWithValue("@EncryptedText", encryptedMessage);
    command.Parameters.AddWithValue("@MessageId", message.Id);

    command.ExecuteNonQuery();

正如@Tomek提到的,您应该使用参数化查询。它更安全,不需要进行@Dan Sueava回答中建议的转换

    SqlCommand command = 
     new SqlCommand("Update Logs SET Message = @EncryptedText WHERE ID = @MessageId");
    command.Parameters.AddWithValue("@EncryptedText", encryptedMessage);
    command.Parameters.AddWithValue("@MessageId", message.Id);

    command.ExecuteNonQuery();

Dan,如果我不能更改引号,我该怎么办?您的查询解决了问题,但现在我确实因为单引号而出错。有没有办法在运行时转义单引号,而不使用单引号永久修改xml消息?您可以执行encryptedMessage.Replace',我知道我可以做到,但我不想永久性地从双人房变为单人房。我想保留单引号。Dan,如果我不能更改引号,我的选项是什么?您的查询解决了问题,但现在我确实因为单引号而出错。有没有办法在运行时转义单引号而不使用单引号永久修改xml消息?您可以执行encryptedMessage.Replace',我知道我可以这样做,但我不想永久性地从双人房变为单人房。我想保留单引号。