2016-11-15 4 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 
    } 
} 

Вы должны также обернуть случаи, когда тип реализует IDisposable в using блоков. Это обеспечивает очистку ресурсов даже в случае исключения. Это особенно справедливо для объекта соединения, который называется con в вашем случае.

+0

вам следует избегать написания запроса в коде –

+0

@viveknuna, объясните свой комментарий, пожалуйста –

+0

поиск SQL Injection на google. –

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

кто бы ни опронил, дайте мне знать причину –

+1

Не the downvoter, но ... OP имеет% по обе стороны от параметров поиска, и ваш запрос содержит их только с одной стороны. Также я считаю, что ''% @ search'' будет восприниматься как буквальная строка и вообще не использовать параметр. – Igor

+0

Это была типография, я отредактировал мой ответ, спасибо за упоминание –

Смежные вопросы