Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема УстановитьТекстовыйПараметр() для строка с single-quote (число прочтений - 2918 )
kos
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 127
Местоположение: Киев
Зарегистрирован: 03. Марта 2013
УстановитьТекстовыйПараметр() для строка с single-quote
25. Августа 2013 :: 20:28
Печать  
Проблема такая:

если в некотором реквизите (или наименовании) объекта (Спр/Док/ и т.д.) типа строка(х)
храниться значение, содержащее одинарную кавычку <'>
то при использовании конструкции

Код
Выбрать все
рс = СоздатьОбъект("ODBCRecordset");
ТекстЗапроса = ......
рс.УстановитьТекстовыйПараметр("ВыбЗначениеСтроки", ВыбЗначениеСтроки);
 



запрос вылетает с ошибкой (т.к. литеральная строка обрезается на этой кавычке и SQL-синтаксис контроль ругается)

Поэтому, чтобы такого не происходило
нужно предварительно само значение "хитро" подготовить:
Код
Выбрать все
ВыбЗначениеСтроки = СтрЗаменить(ВыбЗначениеСтроки,"'","''");
....
рс.УстановитьТекстовыйПараметр("ВыбЗначениеСтроки", ВыбЗначениеСтроки);
 



Голову себе поломал, пока не нашел ответ.
По ссылкам:
http://www.techtamasha.com/escape-single-quotes-and-wild-cards-_-in-ms-sql
http://blog.sqlauthority.com/2008/02/17/sql-server-how-to-escape-single-quotes-f...

Может для гуру это очевидно, но для меня нет.

Опять вопрос к разработчикам  1С++ Смех
(понимаю, что вряд ли кто-то исправлять будет, но вдруг?)

Можно ли во все методы объекта ODBCRecordset
которые отвечают за установку параметров в запрос
для строковых данных добавить автозамену одинарной кавычки <'> на ее дубль <''>
чтобы каждый раз перед выполнением запроса не манипулировать <СтрЗаменить(..)>
Ведь забыть такую замену сделать очень легко....

Реквизитов типа <строка(х)> в любой БД ОООчень много
и для каждого запроса по каждому реквизиту в условиях
не забыть сделать такую замену средствами 1С
- ну оооочень напрягает.....
  
Наверх
 
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: УстановитьТекстовыйПараметр() для строка с single-quote
Ответ #1 - 26. Августа 2013 :: 01:55
Печать  
kos писал(а) 25. Августа 2013 :: 20:28:
Можно ли во все методы объекта ODBCRecordset
которые отвечают за установку параметров в запрос
для строковых данных добавить автозамену одинарной кавычки <'> на ее дубль <''>
чтобы каждый раз перед выполнением запроса не манипулировать <СтрЗаменить(..)>
Ведь забыть такую замену сделать очень легко....

1) можно - исходники есть; но кто это будет делать?

kos писал(а) 25. Августа 2013 :: 20:28:
Реквизитов типа <строка(х)> в любой БД ОООчень много

2) Реквизитов - много, а обоснованного использования одинарных кавычек? Разве что спецификой базы является больше количество зарубежных контрагентов.

kos писал(а) 25. Августа 2013 :: 20:28:
и для каждого запроса по каждому реквизиту в условиях
не забыть сделать такую замену средствами 1С
- ну оооочень напрягает.....


Дык, напиши свой маленький класс-наследник от ODBCRecordset, в котором переопредели необходимые методы.
(например, так:
Код
Выбрать все
Процедура УстановитьТекстовыйПараметр(Имя, Значение) Экспорт
ЗначениеСЭскейпами = СтрЗаменить(Значение, "'", "''");  // в идеале - сделать грамотный парсинг, типо чтоб проверять наличие "внутренных" одинарных кавычек и эскейпать их только в этом случае
Сам(Контекст).ПолучитьБазовыйКласс().УстановитьТекстовыйПараметр(Имя, ЗначениеСЭскейпами);
КонецПроцедуры 


)
Если для массовых (точнее, всех, кроме параметризированных с Подготовить()) запросов используешь глобальную переменную с объектом ОДБЦРекордсет - то тут вообще все примитивно и немного гемороя создаст переписываение использования других экземпляров ОДБЦРекордсет
Если для каждого запроса создаешь свой объект ОДБЦРекордсет - то самое время переписать все на вариант с глобальной переменной.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: УстановитьТекстовыйПараметр() для строка с single-quote
Ответ #2 - 26. Августа 2013 :: 04:48
Печать  
Satans Claws писал(а) 26. Августа 2013 :: 01:55:
Дык, напиши свой маленький класс-наследник от ODBCRecordset, в котором переопредели необходимые методы.

поддерживаю
  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать