'%'+'“+ data +”'+'%'的含义是什么?

时间:2016-02-04 06:04:10

标签: c# sql

这是代码,。

var query = "SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%' + '" + data + "' + '%'";

4 个答案:

答案 0 :(得分:3)

这就是Like运算符的工作原理。

SELECT column_name(s)
FROM table_name
WHERE column_name LIKE pattern

“%”符号用于定义通配符(缺少字母)

WHERE title LIKE'%computer%'在字符串中的任何位置找到所有带有'computer'字样的字符串。

答案 1 :(得分:1)

它是C#字符串连接和SQL字符串连接的组合。

C#部分:

string b = "B";
string x = "A" + b + "C";
//gives you  "ABC"

SQL:

'A' + 'B' + 'C'
// gives you 'ABC'

组合:

sql = "'A' + '" + b + "' + 'C'";

C#string

中的结果
sql = "'A' + 'B' + 'C'"

这导致SQL

'ABC'

在您的情况下,它会导致

ADANo LIKE '%mydata%'

而mydata是data的内容。它使用字段LIKE上的ADANo比较运算符,该运算符返回data中包含ADANo的所有记录。 %个字符是通配符,表示任意数字的任何字符都可以在data之前或之后。

顺便说一句,如果data来自用户,这种代码很容易被SQL注入。这意味着,用户可以通过一些技巧将其作为data传递给数据库执行任意SQL。为避免这种情况,请使用参数化查询。

答案 2 :(得分:1)

分开''%'确实看起来多余。和'数据'。

如果我们使用新的$语法,我们就会得到:

var query = $"SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%' + '{data}' + '%'"; 现在假设datafoobar

这导致

var query = $"SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%' + 'foobar' + '%'";

反过来导致

SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%foobar%'

所以你可以将你的陈述重写为:

var query = $"SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%{data}%'";

或使用字符串concat语法:

var query = "SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%" + data + "%'";

请注意,此方法(通常,不是在这些更改之前或之后)容易受到SQL注入攻击。

例如,data"FOO'; DELETE FROM [dbo].[LDDAP-ADA_Header]; --"

时的查询内容

那么你的最终结果就是

"SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%FOO'; DELETE FROM [dbo].[LDDAP-ADA_Header]; --%'"

这将清除你的表格。

答案 3 :(得分:0)

这是LIKE运营商的纯文本搜索。
LIKE使用像%这样的转义序列来表示"这里任意数量的任何字符/数字"。
基本上是SQL等价的正则表达式搜索/比较。

SELECT * FROM dbo.[LDDAP-ADA_Header] 
WHERE ADANo LIKE '%' + 'foo' + '%'";

但是,此代码包含两个错误:
1.不使用参数,因此易受SQL注入攻击。
2.不转义字符串中的字符,如%

更准确地说,这将是:

var query = "SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%' + '" + data.Replace("'", "''") + "' + '%'";

假设数据不能为NULL,这可能不一定是那样。

但为了实际工作,您需要在like子句中使用ESCAPE(并使用\连接字符串中的所有字符。)

e.g。 "% of size" ==> "\%\ \o\f\ \s\i\z\e"

SELECT * FROM [dbo].[LDDAP-ADA_Header] 
WHERE ADANo LIKE '%' + @data + '%' ESCAPE '\' 

问题是,"数据"最有可能是用户输入字段。
(可能是恶意的)用户可以随意放入该文本框。
如果你不做data.Replace("'","''"),他/她/它可以设置"数据"到

string data = "'; DROP DATABASE whatever; -- " 

然后你会遇到问题(例如,如果我把" master"代替"无论")

警告
除非您想错过主数据库,否则请不要将该字符串放入数据变量中。