Ошибка в операторе like шаблон строки является недопустимым

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, которые не содержат цифр.

Не работает данный запрос. Помогите пожалуйста.

SQL
1
SELECT InvCodes FROM Table1 WHERE  InvCodes LIKE '[ ^9-0]';



0



cygapb-007

1312 / 944 / 144

Регистрация: 17.01.2013

Сообщений: 2,348

06.03.2013, 21:46

2

T-SQL
1
2
3
4
;with CTE as (select * from (values
   ('asdd'), ('as2dd'), ('wewr werw werw'), ('qweq 1 fasdfa')
)t(txt))
select * from CTE where txt not like '%[0-9]%'

Добавлено через 33 минуты
если без CTE, то так:

SQL
1
SELECT InvCodes FROM Table1 WHERE  InvCodes NOT LIKE '%[0-9]%';



1



SerjantGB

2 / 2 / 0

Регистрация: 19.02.2013

Сообщений: 31

03.04.2013, 12:40

3

не хочу создавать новую тему, тем более что нашел подходящую, если никто не против я задам свой вопрос:

C#
1
2
textbox1.text = "Опилки древесные загрязненные минеральными маслами (содержание масел 15%)"
bindingsource1.Filter = "naim like '%" + textbox1.text + "%'";

Ошибка в операторе Like: шаблон строки «%Опилки древесные загрязненные минеральными маслами (содержание масел 15%)%» является недопустимым.

Я так понял что проблема заключается в знаке ‘%’ но в базе таких записей полно, поэтому придется частенько сталкиваться с такого рода записями, базу править нельзя, т е избавиться от этого знака не получится, причем при фильтрации необходимо чтобы этот знак тоже участвовал в отборе данных. как обойти это? кто подскажет?



0



unfilled

23 / 23 / 0

Регистрация: 25.03.2013

Сообщений: 46

03.04.2013, 12:58

4

SerjantGB, вам нужно дополнительно использовать экранирующий символ (параметр escape_character), т.е. добавлять в искомую строку какой-либо символ примерно так:

C#
1
2
3
textbox1.text = "Опилки древесные загрязненные минеральными маслами (содержание масел 15!%)"
string txt = textbox1.text.Replace("%", "!%");
bindingsource1.Filter = "naim like '%" +  + "%' ESCAPE '!'";

‘!’ можно заменить на любой удобный символ.



1



1449 / 1121 / 346

Регистрация: 11.04.2011

Сообщений: 2,621

03.04.2013, 13:10

5

Цитата
Сообщение от SerjantGB
Посмотреть сообщение

что нашел подходящую

Не нашли. Подходящая тема находится где то в разделе по C#.

Цитата
Сообщение от SerjantGB
Посмотреть сообщение

Я так понял что проблема заключается в знаке ‘%’

С точки зрения SQL строка валидная. Тот фильтр, который вы задаете, к SQL не имеет никакого отношения, кроме схожести синтаксиса.

Цитата
Сообщение от SerjantGB
Посмотреть сообщение

как обойти это?

Когда будете использовать LIKE в запросах SQL, то знак процента в строке поиска обозначается двойным процентом (%%).

Добавлено через 6 минут
Что же касается свойства Filter у BindingCource в C#, то … Пожалуй зацитирую:

Цитата
Сообщение от http://msdn.microsoft.com/ru-ru/library/system.data.datacolumn.expression.aspx

Символы * и % могут быть использованы в качестве подстановочных знаков в сравнении 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

Цитата
Сообщение от kodv
Посмотреть сообщение

Когда будете использовать LIKE в запросах SQL, то знак процента в строке поиска обозначается двойным процентом (%%).

Это что-то новенькое!
Я-то думал, что ‘%%’ в шаблоне для LIKE — это всё равно что ‘%’.

Если надо написать символ процента в шаблоне

LIKE, то проще всего это сделать так: ‘[%]’.



0



Shoorup_SCBist

11 / 11 / 0

Регистрация: 16.09.2013

Сообщений: 75

28.05.2015, 09:51

7

У меня фильтр настроен так:

C#
1
2
3
4
private void textBoxFilter1(object sender, KeyEventArgs e)
        {
            bindingSource1.Filter = string.Format("Model LIKE '%{0}%'", textBoxFilter1.Text);
        }

если ввести символ [ естественно вывалит эксепшн что не закрыто. А что делать если мне нужно искать по этому символу? Я понимаю что нужно написать что-то типа [[] , но как сделать чтобы я писал [ а искало по [[] ?

Добавлено через 24 минуты
Решил так:

C#
1
2
3
4
string textFilterModel = textBoxFilterModel.Text;
         textFilterModel = textFilterModel.Replace("[", "[[]");
         textFilterModel = textFilterModel.Replace("%", "[%]");
         textFilterModel = textFilterModel.Replace("*", "[*]");

Возможно есть еще какие символы которые нужно подменять, но мне кажется так нагляднее, что на что меняется и добавить новую замену легко.
Может есть более красивое или правильное решение?



0



iap

1109 / 754 / 182

Регистрация: 27.11.2009

Сообщений: 2,250

28.05.2015, 11:11

8

Цитата
Сообщение от Shoorup_SCBist
Посмотреть сообщение

У меня фильтр настроен так:

C#
1
2
3
4
private void textBoxFilter1(object sender, KeyEventArgs e)
        {
            bindingSource1.Filter = string.Format("Model LIKE '%{0}%'", textBoxFilter1.Text);
        }

если ввести символ [ естественно вывалит эксепшн что не закрыто. А что делать если мне нужно искать по этому символу? Я понимаю что нужно написать что-то типа [[] , но как сделать чтобы я писал [ а искало по [[] ?

Добавлено через 24 минуты
Решил так:

C#
1
2
3
4
string textFilterModel = textBoxFilterModel.Text;
         textFilterModel = textFilterModel.Replace("[", "[[]");
         textFilterModel = textFilterModel.Replace("%", "[%]");
         textFilterModel = textFilterModel.Replace("*", "[*]");

Возможно есть еще какие символы которые нужно подменять, но мне кажется так нагляднее, что на что меняется и добавить новую замену легко.
Может есть более красивое или правильное решение?

А звёздочка-то тут при чём?
Зато подчёркивание никак не обрабатываете.
Кстати говоря, REPLACE можно и серверный использовать (вложенный, с последовательной заменой процента, подчёркивания и левой квадратной скобки).
А наличие одиночного символа проще проверять функцией CHARINDEX().
Вижу большую проблему с поиском символа из множества, включающего символ «]», с помощью LIKE без ESCAPE
Это печально, ибо исключает применение функции PATINDEX(), так как в ней никакого ESCAPE не предусмотрено.



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

Цитата
Сообщение от Shoorup_SCBist
Посмотреть сообщение

Звездочку обрабатываю потому как не ищет. А подчеркивание ищет.

Сервер Microsoft SQL Server?
Тогда для LIKE «*» — это самый обычный символ, не несущий никакого специального смысла.
А «_» означает «один любой символ», а вовсе не символ подчёркивания.
Так что непонятно, что Вы сейчас написали.



0



Shoorup_SCBist

11 / 11 / 0

Регистрация: 16.09.2013

Сообщений: 75

28.05.2015, 14:03

11

Microsoft SQL Server.
перед тем как писать я провел эксперименты.

C#
1
2
3
4
5
6
7
8
private void textBoxFilterModel_KeyUp(object sender, KeyEventArgs e)
        {
            string textBoxFilterModelRep = textBoxFilterModel.Text;
            textBoxFilterModelRep = textBoxFilterModelRep.Replace("[", "[[]");
            textBoxFilterModelRep = textBoxFilterModelRep.Replace("%", "[%]");
            textBoxFilterModelRep = textBoxFilterModelRep.Replace("*", "[*]");
            bsEq.Filter = string.Format("Model_standart_number LIKE '%{0}%'", textBoxFilterModelRep);
        }

Если убрать 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-инъекции.

Понравилась статья? Поделить с друзьями:
  • Ошибка в опель корса insp
  • Ошибка в опель инсигния мощность двигателя будет ограничена
  • Ошибка в онлайн билете ржд
  • Ошибка в октмо при уплате налога
  • Ошибка в октмо при сдаче ндфл