2014-12-11 3 views
0

У меня есть база данных концертов, которые я ищу от Artist, и пытаюсь использовать LIKE в sql-запросе, но не удается.C# sql search with LIKE

Я попытался:

string strSQL = "SELECT * FROM TB_CA_gigs WHERE Artist LIKE '[%" + Artist + "%]'"; 

, которая не возвращает никаких записей

string strSQL = "SELECT * FROM TB_CA_gigs WHERE Artist LIKE '%[" + Artist + "]%'"; 

, который возвращает все записи

string strSQL = "SELECT * FROM TB_CA_gigs WHERE Artist LIKE '" + Artist + "'"; 

, который возвращает не записывает

У меня есть попробовал Sing СОДЕРЖИТ различными способами, но всегда получаю ту же ошибку:

System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'CONTAINS'. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlDataReader.ConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader() at WebService1.Service1.Search(String Artist) in C:\Users\strscac\Desktop\VS\WebService1\WebService1\WebService1\Service1.asmx.cs:line 36

+6

Почему вы используете скобки [] в своем стиле? Попробуйте просто сделать «%» + Artist + «%» –

+1

Также не похоже, что вы используете параметризованные запросы. – wahwahwah

ответ

1

Вы пропустили одну комбинацию, которая будет работать:

string strSQL = "SELECT * FROM TB_CA_gigs WHERE Artist LIKE '%" + Artist + "%'"; 

И как сказал wahwahwah, как я уверен, что другие будут тоже: как хорошая практика, изучать и использовать параметризованные запросы, чтобы избежать уязвимости SQL-инъекции.

Для простого примера параметризованного запроса ознакомьтесь с документацией MSDN для System.Data.SqlClient.SqlCommand.Parameters.

+0

, который работал спасибо, просто чтобы ответить на ваш вопрос - я использовал скобки как Я видел это здесь: http://stackoverflow.com/questions/6231744/how-to-search-for-in-sql-table-column – user3606041

+1

@ user3606041 В этом примере '[]' используются как «escape» символов ", чтобы указать, что запрос ищет результат, содержащий'% '- например, если у вас было' 5% 'в качестве значения в вашей базе данных. – wahwahwah

+0

@ user3606041 пожалуйста, прочитайте также ссылку Cory. Вы никогда не должны использовать заявление здесь на производстве. – wahwahwah

2

попробовать что-то вроде этого:

string strSQL = string.Format("SELECT * FROM TB_CA_gigs WHERE Artist LIKE '%{0}%'", Artist); 

Хотя вы всегда должны параметризовать свои значения (например, Artist должен быть параметром) для защиты от атак SQL-инъекций.

+0

ummm ... это не то, что означает создание параметризованного запроса. Что, если 'Художник' был =' DROP TABLE Artist'? Ваш пример не отличается от того, который использует OP ... [см. Здесь] (http://stackoverflow.com/questions/542510/how-do-i-create-a-parameterized-sql-query-why-should -i) – wahwahwah

+0

Да ... и именно поэтому я сказал «хотя вы должны» не «это пример». Если бы ОП задал вопрос о создании параметризованных запросов, я бы указал им в правильном направлении. Как бы то ни было, я включил его в качестве примечания о наилучшей практике (ну, скорее, как минимум принятая практика). – Dean

+1

Это было совсем не ясно (и на самом деле не совсем ясно сейчас) из ваших предварительных сообщений ... но снисходительность определенно важна :) – wahwahwah