这是代码,。
var query = "SELECT * FROM [dbo].[LDDAP-ADA_Header] WHERE ADANo LIKE '%' + '" + data + "' + '%'";
答案 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}' + '%'";
现在假设data
是foobar
。
这导致
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"代替"无论")
警告强>
除非您想错过主数据库,否则请不要将该字符串放入数据变量中。