System.Data.SqlClient.SqlException on dataadapter.Fill(datab



我正在研究这个程序。然后当我开始调试它时,它似乎运行得很顺利。但随后它只是停止,然后弹出一个音符

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

请帮助我。

concat 函数中的参数被引号括起来,这没有意义。这些必须是列名。

将查询对象更改为 :

var query = "SELECT * FROM users WHERE CONCAT(lastname, middle, firstname, username) like '%" + valueToSearch + "%'";

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"是"一百三千四百五十六",还是"一百二十三四五六")。

最新更新