通过string.format生成的SQL查询字符串中的转义字符

use*_*468 4 c# sql string formatting

我在c#中有声明:

String sql = String.Format("UPDATE Table SET FIRST_NAME='{0}',LAST_NAME='{1}',BIRTH_DATE='{2}' where CUSTOMER_NUMBER ='{3}'",FirstName, LastName,DateOfBirth,Number);
Run Code Online (Sandbox Code Playgroud)

如果名字,姓氏等有撇号像O'Hare,O'Callahagan,则上述语句不会执行,因为更新语句的语法错误.

如何在string.format中转义撇号?

das*_*ght 16

如何在string.format中转义撇号?

不要逃避它,而是使用参数化查询.

想象一下,一个非常传统的用户名称非常类似于SQL语句,用于删除表或做同样恶意的事情.逃避报价不会有太大帮助.

请改用此查询:

String sql = @"UPDATE Table
    SET FIRST_NAME=@FirstName
,   LAST_NAME=@LastName
,   BIRTH_DATE=@BirthDate
WHERE CUSTOMER_NUMBER =@CustomerNumber";
Run Code Online (Sandbox Code Playgroud)

在此之后,设置的值FirstName,LastName,DateOfBirth,和Number在相应的参数:

SqlCommand command = new SqlCommand(sql, conn);
command.Parameters.AddWithValue("@FirstName", FirstName);
command.Parameters.AddWithValue("@LastName", LastName);
command.Parameters.AddWithValue("@BirthDate", BirthDate);
command.Parameters.AddWithValue("@CustomerNumber", CustomerNumber);
Run Code Online (Sandbox Code Playgroud)

您的RDMBS驱动程序将为您完成所有其他操作,保护您免受恶意攻击.作为一个额外的好处,当您的RDBMS的日期格式与您的计算机date不同时,它可以让您避免问题:因为您将不再作为字符串表示传递,所以在理解格式化日期的哪个部分代表一天,哪一个代表一个月.