Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# dataadapter.Fill(DataTable)上的System.Data.SqlClient.SqlException;_C# - Fatal编程技术网

C# dataadapter.Fill(DataTable)上的System.Data.SqlClient.SqlException;

C# dataadapter.Fill(DataTable)上的System.Data.SqlClient.SqlException;,c#,C#,我有一个我正在研究的项目。然后,当我开始调试它时,它似乎运行得非常顺利。但它只是停了下来,然后一张便条弹出 System.Data.SqlClient.SqlException靠近“`”的语法不正确 这是我的密码 public void searchData(string valueToSearch) { string query = "SELECT * FROM users WHERE CONCAT(`lastname`, `middle`, `firstname`, `userna

我有一个我正在研究的项目。然后,当我开始调试它时,它似乎运行得非常顺利。但它只是停了下来,然后一张便条弹出

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
,这告诉我们您正在使用sqlserver。SQL Server使用TSQL语法,其中
[identifier]
是正确的转义语法,并且是可选的,因此除非列/表名是保留关键字,否则您可以直接使用该名称:

 WHERE CONCAT(lastname, middle, firstname, username)

第二个也是更严重的问题是:SQL注入。您应该永远不要将用户输入连接到查询中。大量数据泄露和中断就是这样发生的——这是一个巨大的安全漏洞,你越早学会不这样做越好。相反,请使用以下参数:


这完全可以保护您不受SQL注入的影响(除非您在SQL中做了一些愚蠢的事情,例如执行它),并且(在数字/日期等情况下)解决了一系列“文化”问题(例如“123456”是否为“一百二十三四百五十六”,或是否为“123点”456”)。

搜索
值的值是多少?请注意,此代码是开放的!和后面的记号(就像你在CONCAT(`lastname``…
中使用的那样)SQL中的有效引号?指定您正在使用的RDBMS,连接用于SQL server,但您的列名转义符号如下MySQL@user6144226RDBMS已经被指定:
SqlClient
专门指SQLServer作为旁注,我应该指出,使用数据适配器、数据表等并不是真正的主要方法这些天代码的方向。它会起作用,但请不要认为这是正常的。它仍然会发生,但是…有更好的方法处理数据。它起作用了。但是var和字符串的区别是什么?对不起,我只是一个11年级的学生,所以,
var
位并不重要。其余的变化是重要的。如果
var
容易混淆,只需将其更改为
string
。var关键字指示编译器从初始化语句右侧的表达式推断变量的类型。-MSDN。请看这里:如果您发现它混淆,请将其更改为string。
 string query = "... like @searchVal";
 SqlCommand command = new SqlCommand(query, connection);
 command.Parameters.AddWithValue("@searchVal", "%" + valueToSearch + "%");
 // ...