接管我前任的一些代码,我找到了一个使用Like运算符的查询:
SELECT * FROM供应商 供应商名称如'%'+名称+%';
尝试避免SQL注入问题并对此进行参数化,但我不确定如何实现。有什么建议吗?
请注意,我需要一个经典ADO.NET的解决方案 - 我真的不需要将这些代码转换为类似LINQ的东西。
答案 0 :(得分:18)
试试这个:
var query = "select * from foo where name like @searchterm";
using (var command = new SqlCommand(query, connection))
{
command.Parameters.AddWithValue("@searchterm", String.Format("%{0}%", searchTerm));
var result = command.ExecuteReader();
}
框架将自动处理引用问题。
答案 1 :(得分:8)
只需参数化您的查询:
SELECT * FROM suppliers WHERE supplier_name like '%' + @name + '%'
现在您可以将“name”变量传递给@name参数,查询将在没有任何注入攻击危险的情况下执行。即使你传递的内容如“'或'真 - ”它仍然可以正常工作。
答案 2 :(得分:0)
在Entity Framework 6中,Native SQL可以这样做:
List<Person> peopleList = contex.People.SqlQuery(
@"SELECT * FROM [Person].[Person]
WHERE [FirstName] LIKE N'%' + @p0 + '%' ", "ab").ToList();
或者
List<Person> peopleList = contex.People.SqlQuery(
@"SELECT * FROM [Person].[Person]
WHERE [FirstName] LIKE N'%' + @name + '%' ",
new SqlParameter("@name", "ab")).ToList();
此外,您可以直接使用LINQ to Entities:
List<Person> peopleList1 = contex.People.Where(s => s.FirstName.Contains("ab")).ToList();
答案 3 :(得分:-5)
Short Anwser:
1)name.Replace(“'”,“''”)....替换数据库可能具有的任何转义字符(单引号是最常见的)
2)如果你使用像.net这样的语言使用参数化查询
sql="Insert into Employees (Firstname, Lastname, City, State, Zip, Phone, Email) Values ('" & frmFirstname.text & "', '" & frmLastName & "', '" & frmCity & "', '" & frmState & "', '" & frmZip & "', '" & frmPhone & "', '" & frmEmail & "')"
以上
取代上述内容Dim MySQL as string = "Insert into NewEmp (fname, LName, Address, City, State, Postalcode, Phone, Email) Values (@Firstname, @LastName, @Address, @City, @State, @Postalcode, @Phone, @Email)"
With cmd.Parameters:
.Add(New SQLParameter("@Firstname", frmFname.text))
.Add(New SQLParameter("@LastName", frmLname.text))
.Add(New SQLParameter("@Address", frmAddress.text))
.Add(New SQLParameter("@City", frmCity.text))
.Add(New SQLParameter("@state", frmState.text))
.Add(New SQLParameter("@Postalcode", frmPostalCode.Text))
.Add(New SQLParameter("@Phone", frmPhone.text))
.Add(New SQLParameter("@email", frmemail.text))
end with
3)用户存储过程
4)如果您使用.net
,请再次使用Linq to SQL