2016-11-15 81 views
-1

我有以下的SQL查询,我想通过两个变量得到结果。但是,我得到一个语法错误,更具体:为什么我的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 '%' [email protected]+ '%' AND apellido LIKE '%' [email protected]+ '%' "; 

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); 
} 
+1

如果你在你的代码中添加SQL通配符代替'.AddWithValue( “@搜索”, “%” +搜索+ “%”)'和'像@ search'? – juharr

+0

@midori你检查我的答案吗? –

回答

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

+0

你应该避免写代码 –

+0

@viveknuna,请解释你的评论,请 –

+0

谷歌搜索SQL注入。 –

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; 

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

+0

谁downvoted,让我知道原因 –

+1

不是downvoter,但... OP在搜索参数的两侧都有%,并且您的查询只在一侧有它们。我也相信''%@ search''会被当作一个字符串,根本不使用这个参数。 – Igor

+0

这是一个错字我编辑了我的答案,谢谢提及 –

-1

试试这个:

​​
+0

这甚至不会编译。 – juharr