在C#中创建一个字符串,用于SQL包含存储过程中的函数

时间:2016-02-19 09:04:50

标签: c# sql-server escaping

我有一个这样的存储过程:

ALTER PROCEDURE autoCompleteFeedback
    @words varchar(255) 
AS
BEGIN
    SET NOCOUNT ON;

    SELECT DISTINCT TOP 5 * 
    FROM feedback 
    WHERE CONTAINS(feedbackMsg, @words)  
      AND NOT feedbackMsg LIKE '%Del%';
END
GO

EXEC autoCompleteFeedback '"*Who*"'

效果很好

但现在我想从C#传递一个单词到我的程序

例如:

 string myString = "whooHoo";
 string auto = '"*+myString+*"';
 var a = nm.autoCompleteFeedback(auto).ToList();

我无法正确获取转义字符,是否可能?

提前致谢

3 个答案:

答案 0 :(得分:1)

您可以使用反斜杠转义引号:

string auto = $"'\"*{myString}*\"'";

或者您可以在字符串前使用@符号来获取逐字字符串文字。这样你可以使用双引号来逃避引号:

string auto = $@"'""*{myString}*""'";

在这种情况下,我会选择第一个选项,因为在我看来它更具可读性。

通过使用$,您可以将变量插入带大括号的字符串中:

string name = "Alexander";
string greet = $"Hello {name}";
//greet = "Hello Alexander"

答案 1 :(得分:0)

有两种scaping方法:

  1. 使用反斜杠。要花费",您必须使用\"
  2. 使用@"Your query"在查询中使用""来搜索wuotes
  3. 第二个选项允许您定义多行字符串,如下所示:

    var query= @"Alter PROCEDURE autoCompleteFeedback
    -- Add the parameters for the stored procedure here
    @words varchar(255) 
    
    AS
    BEGIN
    
    SET NOCOUNT ON;
    select distinct top 5  * from feedback where CONTAINS(feedbackMsg,@words)
    AND NOT feedbackMsg LIKE '%Del%';
    
    END
    ";
    

    重要提示:不要连接字符串来执行任何类型的SQL。始终使用参数,否则您将受到SQL注入攻击。

答案 2 :(得分:0)

最简单的答案;

string myString = "whooHoo";
string auto = "'\"*" + myString + "*\"'";

Console.WriteLine(myString); // whooHoo
Console.WriteLine(auto); // '"*whooHoo*"'