dataadapter.Fill上的System.Data.SqlClient.SqlException(数据表);

时间:2018-03-19 09:25:21

标签: c#

我正在使用这个程序。然后,当我开始调试它时,它看起来非常顺畅。但它然后停止然后弹出一个音符

  

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);上弹出了消息,我真的不知道问题的哪个部分,因为它没有出现在错误列表中。

请帮帮我。

2 个答案:

答案 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"是"一百二十三四百五十六"或者是否是"一个一百二十三四五六")。