我正在使用这个程序。然后,当我开始调试它时,它看起来非常顺畅。但它然后停止然后弹出一个音符
System.Data.SqlClient.SqlException'''附近的语法不正确。'
这是我的代码。
public void searchData(string valueToSearch)
{
string query = "SELECT * FROM users WHERE CONCAT(`lastname`, `middle`, `firstname`, `username`) like '%" + valueToSearch + "%'";
SqlCommand command = new SqlCommand(query, connection);
SqlDataAdapter sda = new SqlDataAdapter(command);
DataTable dt = new DataTable();
sda.Fill(dt);
dataGridView1.DataSource = dt;
}
并且sda.Fill(dt);
上弹出了消息,我真的不知道问题的哪个部分,因为它没有出现在错误列表中。
请帮帮我。
答案 0 :(得分:4)
concat函数中的参数被引号括起来,这是没有意义的。那些必须是列名。
将查询对象更改为:
var query = "SELECT * FROM users WHERE CONCAT(lastname, middle, firstname, username) like '%" + valueToSearch + "%'";
答案 1 :(得分:3)
您的SQL中存在两个问题; 立即一个是您正在使用错误的转义变体。 SQL比实际规则更多地称为指南,而不同的供应商使用不同的规则。您正在使用反引号转义表单:
`identifier`
您还在问题中提到了SqlClient
,它告诉我们您正在使用SQL Server。 SQL Server使用TSQL语法,其中[identifier]
是正确的转义语法 - 并且它是可选的,因此除非您的列/表名称是保留关键字,否则您可以直接使用该名称:
WHERE CONCAT(lastname, middle, firstname, username)
第二个和IMO更严重的问题是:SQL注入。您应该从不将用户输入连接到查询中。这就是大量数据泄露和中断发生的原因 - 这是一个巨大的安全漏洞,越早学会不这样做:越好。而是使用参数:
string query = "... like @searchVal";
SqlCommand command = new SqlCommand(query, connection);
command.Parameters.AddWithValue("@searchVal", "%" + valueToSearch + "%");
// ...
此完全保护您免受SQL注入(除非您在SQL中做了些愚蠢的事情,例如EXEC
- ),和(在数字/日期/等的情况下)解决了广泛的"文化"问题(例如" 123,456"是"一百二十三千四百五十六"或者是否是"一个一百二十三点四五六")。