C# 为什么我的SQL语法是错误的?

C# 为什么我的SQL语法是错误的?,c#,mysql,asp.net,C#,Mysql,Asp.net,我有下面的SQL查询,希望通过两个变量获得结果。但是,我得到了一个语法错误,更具体地说: near '+'pablo'+ '%' AND apellido LIKE '%' +'rodriguez'+ '%'' at line 1 at MySql.Data.MySqlClient.MySqlStream.ReadPacket() at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32&

我有下面的SQL查询,希望通过两个变量获得结果。但是,我得到了一个语法错误,更具体地说:

near '+'pablo'+ '%' AND apellido LIKE '%' +'rodriguez'+ '%'' at line 1 at
MySql.Data.MySqlClient.MySqlStream.ReadPacket() at
MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int32&
insertedId) at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId,
Int32&affectedRows, Int32& insertedId) at
MySql.Data.MySqlClient.Driver.NextResult(Int32
statementId, Boolean force) at
MySql.Data.MySqlClient.MySqlDataReader.NextResult()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at
MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() at
ProyectoProgra4Nota3.modelos.Usuario.buscarQuery(String search, String search2)
这是我的疑问:

MySqlCommand comando = new MySqlCommand();
comando.Connection = con.usaConexion();
comando.CommandText = "SELECT * FROM usuarios WHERE nombre LIKE '%' +@search+ '%' AND apellido LIKE '%' +@search2+ '%' ";

comando.Parameters.AddWithValue("@search", search);
comando.Parameters.AddWithValue("@search2", search2);

MySqlDataReader reader = comando.ExecuteReader();

while (reader.Read())
{
    Usuario u2 = new Usuario();

    u2.Correo = reader["correo"].ToString();
    u2.Nombre = reader["nombre"].ToString();
    u2.Apellido = reader["apellido"].ToString();
    u2.Clave = reader["clave"].ToString();

    lista.Add(u2);
}

首先,您不应该这样调用查询。您必须创建一个存储过程并从c#代码调用该存储过程

您的查询应该是:

SELECT * FROM usuarios WHERE nombre LIKE LIKE '%@search%' and AND apellido LIKE '%@search2%'
注意:您应该与您的连接和读卡器对象一起使用。或者您可以在
finally
块中关闭和处理连接

将参数添加到命令中可以比您编写的更好地完成

command.Parameters.Add("@someParam", SqlDbType.Int);
command.Parameters["@someparam"].Value = someParamValue;

这里告诉您参数的数据类型,这样可以避免运行时错误。

尝试以下操作,它将通配符直接添加到参数中,而不是查询本身。如果您可以发布一条英文堆栈跟踪/错误消息,这将非常有帮助

using(MySqlCommand comando = new MySqlCommand())
{
    comando.Connection = con.usaConexion();
    comando.CommandText = "SELECT * FROM usuarios WHERE nombre LIKE @search AND apellido LIKE @search2";

    comando.Parameters.AddWithValue("@search", "%"+search+"%");
    comando.Parameters.AddWithValue("@search2", "%"+search2+"%");

    using(MySqlDataReader reader = comando.ExecuteReader())
    {
        // rest of code
    }
}
您还应该使用块包装类型在
中实现IDisposable的实例。这确保了即使在发生异常的情况下也能清理资源。这对于连接对象尤其如此,在您的例子中名为
con

尝试以下方法:

comando.CommandText = "SELECT * FROM usuarios 
                       WHERE nombre LIKE '%' " +@search+ '%' 
                       AND apellido LIKE '%' +@search2+ '%' ";

如果将通配符添加到代码中,而不是添加到SQL
.AddWithValue(“@search”、“%”+search+“%”)和
中,比如@search
?@midori,您检查了我的答案了吗?不是下拉投票人,而是。。。OP在搜索参数的两侧都有%,而您的查询只有一侧有。另外,我相信,
“%@search”
将被视为一个文本字符串,根本不使用参数。这是一个我编辑了答案的打字错误,谢谢mentioning@viveknuna,解释你的评论,please@viveknuna-通过正确使用参数缓解SQL注入漏洞。在代码中编写/定义查询与Sql注入攻击/漏洞互不相关,甚至无法编译。