I’m getting the exception:
Error in Like operator: the string pattern ‘Blah [Blah Blah]’ is invalid.
It’s occurring where I’m using a datatable’s Select
method like so:
DataRow[] rows = table.Select("X Like '" + y + "'");
I’ve seen from reading other posts that it’s the square brackets. The posts I’ve read say to escape the squares brackets but most of them focus on the source of the problem being a hard coded string the developer can easily escape.
I’m reading the data in from a database. I could do something like y.replace("[", "\[")
which I’m guessing would fix the issue for square brackets. But then I’m wondering, what if elsewhere in the DB there is a string with an * etc.
How do others deal with this? Can I call something that will make a string safe by escaping all possibly illegal characters or is it a case of manually replacing them with escaped equivalents?
Little-Ann 0 / 0 / 0 Регистрация: 04.01.2013 Сообщений: 13 |
||||
1 |
||||
06.03.2013, 20:45. Показов 7656. Ответов 10 Метки нет (Все метки)
Запрос который возвращает только те InvCodes, которые не содержат цифр. Не работает данный запрос. Помогите пожалуйста.
0 |
cygapb-007 1312 / 944 / 144 Регистрация: 17.01.2013 Сообщений: 2,348 |
||||||||
06.03.2013, 21:46 |
2 |
|||||||
Добавлено через 33 минуты
1 |
SerjantGB 2 / 2 / 0 Регистрация: 19.02.2013 Сообщений: 31 |
||||
03.04.2013, 12:40 |
3 |
|||
не хочу создавать новую тему, тем более что нашел подходящую, если никто не против я задам свой вопрос:
Ошибка в операторе Like: шаблон строки «%Опилки древесные загрязненные минеральными маслами (содержание масел 15%)%» является недопустимым. Я так понял что проблема заключается в знаке ‘%’ но в базе таких записей полно, поэтому придется частенько сталкиваться с такого рода записями, базу править нельзя, т е избавиться от этого знака не получится, причем при фильтрации необходимо чтобы этот знак тоже участвовал в отборе данных. как обойти это? кто подскажет?
0 |
unfilled 23 / 23 / 0 Регистрация: 25.03.2013 Сообщений: 46 |
||||
03.04.2013, 12:58 |
4 |
|||
SerjantGB, вам нужно дополнительно использовать экранирующий символ (параметр escape_character), т.е. добавлять в искомую строку какой-либо символ примерно так:
‘!’ можно заменить на любой удобный символ.
1 |
1449 / 1121 / 346 Регистрация: 11.04.2011 Сообщений: 2,621 |
|
03.04.2013, 13:10 |
5 |
что нашел подходящую Не нашли. Подходящая тема находится где то в разделе по C#.
Я так понял что проблема заключается в знаке ‘%’ С точки зрения SQL строка валидная. Тот фильтр, который вы задаете, к SQL не имеет никакого отношения, кроме схожести синтаксиса.
как обойти это? Когда будете использовать LIKE в запросах SQL, то знак процента в строке поиска обозначается двойным процентом (%%). Добавлено через 6 минут
Символы * и % могут быть использованы в качестве подстановочных знаков в сравнении LIKE.Если строка в предложении LIKE содержит * или %, эти символы должны быть заключены в квадратные скобки ([]).Если в предложении содержится квадратная скобка, каждый символ квадратной скобки должен быть заключен в квадратные скобки (например, [[] или []]).Подстановочные знаки допустимы в конце и начале шаблона, либо в конце шаблона, либо в начале шаблона. Например: «ItemName LIKE ‘*product*'» «ItemName LIKE ‘*product'» «ItemName LIKE ‘product*'» Подстановочные знаки недопустимы в середине строки.Например, строка «te*xt» недопустима. Остальные особенности фльтра можно посмотреть по ссылке. В вашем случае ошибка из-за того, что в строке процент находится не в конце строки. Еще раз повторю, с точки зрения SQL это допускается.
1 |
1109 / 754 / 182 Регистрация: 27.11.2009 Сообщений: 2,250 |
|
03.04.2013, 13:24 |
6 |
Когда будете использовать LIKE в запросах SQL, то знак процента в строке поиска обозначается двойным процентом (%%). Это что-то новенькое! Если надо написать символ процента в шаблоне LIKE, то проще всего это сделать так: ‘[%]’.
0 |
Shoorup_SCBist 11 / 11 / 0 Регистрация: 16.09.2013 Сообщений: 75 |
||||||||
28.05.2015, 09:51 |
7 |
|||||||
У меня фильтр настроен так:
если ввести символ [ естественно вывалит эксепшн что не закрыто. А что делать если мне нужно искать по этому символу? Я понимаю что нужно написать что-то типа [[] , но как сделать чтобы я писал [ а искало по [[] ? Добавлено через 24 минуты
Возможно есть еще какие символы которые нужно подменять, но мне кажется так нагляднее, что на что меняется и добавить новую замену легко.
0 |
iap 1109 / 754 / 182 Регистрация: 27.11.2009 Сообщений: 2,250 |
||||||||
28.05.2015, 11:11 |
8 |
|||||||
У меня фильтр настроен так:
если ввести символ [ естественно вывалит эксепшн что не закрыто. А что делать если мне нужно искать по этому символу? Я понимаю что нужно написать что-то типа [[] , но как сделать чтобы я писал [ а искало по [[] ? Добавлено через 24 минуты
Возможно есть еще какие символы которые нужно подменять, но мне кажется так нагляднее, что на что меняется и добавить новую замену легко. А звёздочка-то тут при чём?
0 |
11 / 11 / 0 Регистрация: 16.09.2013 Сообщений: 75 |
|
28.05.2015, 11:25 |
9 |
Звездочку обрабатываю потому как не ищет. А подчеркивание ищет.
0 |
1109 / 754 / 182 Регистрация: 27.11.2009 Сообщений: 2,250 |
|
28.05.2015, 11:54 |
10 |
Звездочку обрабатываю потому как не ищет. А подчеркивание ищет. Сервер Microsoft SQL Server?
0 |
Shoorup_SCBist 11 / 11 / 0 Регистрация: 16.09.2013 Сообщений: 75 |
||||
28.05.2015, 14:03 |
11 |
|||
Microsoft SQL Server.
Если убрать Replace(«[«, «[[]») — ловим эксепшн.
0 |
У меня исключение:
Ошибка в операторе Like: шаблон строки «Бла [Бла Бла]» недействителен.
Это происходит, когда я использую метод Select
таблицы данных следующим образом:
DataRow[] rows = table.Select("X Like '" + y + "'");
Я видел из чтения других сообщений, что это квадратные скобки. В сообщениях, которые я читал, говорится, что нужно избегать квадратных скобок, но большинство из них сосредоточено на источнике проблемы, являющемся жестко закодированной строкой, которую разработчик может легко избежать.
Я читаю данные из базы данных. Я мог бы сделать что-то вроде y.replace("[", "\[")
, что, я думаю, решит проблему с квадратными скобками. Но тогда мне интересно, что, если где-то в БД есть строка с * и т.д.
Как с этим справляются другие? Могу ли я вызвать что-то, что сделает строку безопасной, экранируя все возможные недопустимые символы, или это случай ручной замены их экранированными эквивалентами?
1 ответ
На случай, если кто-то еще столкнется с этим, вот решение, с которым я пошел. Вторя предложению Фредерика выше, решение Джона Скитса здесь также должен был использовать нечто иное, чем DataTable.Select(), поэтому я воспользовался его предложением LINQ.
Однако я также наткнулся на этот ответ Правильный способ избежать символы в выражении фильтра DataTable, которое дает некоторый код, который можно использовать повторно, если вы действительно хотите реализовать способ экранирования большинства возможных недопустимых символов. Однако, поскольку вы не знаете, какой символ может быть недопустимым при любых условиях, я предпочел решение, которое не полагалось на эту технику.
1
Community
23 Май 2017 в 15:06
Я получаю исключение:
Ошибка в операторе Like: шаблон строки «Blah [Blah Blah]» недействителен.
Это происходит, когда я использую datatable. Выберите метод, например:
DataRow[] rows = table.Select("X Like '" + y + "'");
Я видел, как читал другие сообщения, которые, как подозревали, это квадратные скобки. Посты, которые я прочитал, говорят, что они избегают квадратных квадратов, но большинство из них сосредоточено на том, что источником проблемы является жестко закодированная строка, которую разработчик может легко избежать.
Я читаю данные из базы данных. Я мог бы сделать что-то вроде y.replace(«[«, » [«], которое, как я предполагаю, исправит проблему для квадратных скобок. Но тогда мне интересно, что, если в другом месте в БД есть строка с * и т.д.
Как другие справляются с этим? Могу ли я вызвать то, что сделает строку безопасной, экранируя все, возможно, незаконные символы, или это случай, когда они вручную заменяют их экранированными эквивалентами?
Спасибо, Саймон
Добрый день, товарищи, программисты, здесь я столкнулся с ошибкой. Вы видите, что мой поиск завершается сбоем, когда я ввожу случайные символы, например следующие:% ^ & * &%. Вот ошибка и код поиска, см. Ниже:
Ошибка сервера в приложении ‘/’
Ошибка в операторе Like: шаблон строки «% $% ^ $ & ^%» недействителен.
Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.
Сведения об исключении: System.Data.EvaluateException: ошибка в операторе Like: шаблон строки «% $% ^ $ & ^%» недействителен.
Ошибка источника:
Необработанное исключение было создано во время выполнения текущего веб-запроса. Информацию о происхождении и местонахождении исключения можно определить с помощью трассировки стека исключений ниже.
Трассировки стека:
И код такой:
public static bool IsDate(Object obj) { string strDate = obj.ToString(); try { DateTime dt = DateTime.Parse(strDate); if (dt != DateTime.MinValue && dt != DateTime.MaxValue) return true; return false; } catch { return false; } } protected void BtnWinnersSearch_Click(object sender, EventArgs e) { string searchText = txtWinnersSearch.Text.Replace("'", "''").Trim(); bool isDate = IsDate(searchText); GridViewWinners.Visible = true; if (isDate == true) { SqlDataSource4.FilterExpression = "dob" + " ='" + Convert.ToDateTime(searchText).ToString("yyyy-MM-dd") + "'"; } else { SqlDataSource4.FilterExpression = "nickname like '%" + searchText + "%' or username like '%" + searchText + "%' or clubnumber like '%" + searchText + "%' or firstname like '%" + searchText + "%' or lastname like '%" + searchText + "%' or email like '%" + searchText + "%'"; } }
Прямо сейчас ваш код уязвим для атаки с использованием SQL-инъекции.