为什么我的SQL语法错了?

时间:2016-11-15 19:36:22

标签: 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&
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);
}

3 个答案:

答案 0 :(得分:2)

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

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
    }
}

您还应将实例包装在using块中实现IDisposable的类型中。这确保即使在发生异常时也可以清理资源。对于连接对象尤其如此,在您的情况下名为con

答案 1 :(得分:0)

首先,您不应该像这样调用查询。您必须创建一个存储过程并从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;

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

答案 2 :(得分:-1)

试试这个:

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