2016-11-15 80 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