C# dataadapter.Fill(DataTable)上的System.Data.SqlClient.SqlException;
我有一个我正在研究的项目。然后,当我开始调试它时,它似乎运行得非常顺利。但它只是停了下来,然后一张便条弹出 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
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 + "%");
// ...