Имя: Пароль:
1C
1С v8
Проблемы с кавычками в запросе из 1с в mssql
0 sasha_mrg
 
01.12.11
13:33
ТекстЗапроса = "INSERT INTO Abonents (ID, NAME) VALUES ("+ВыборкаПотребителей.Код+", "+ВыборкаПотребителей.Наименование+")";

при вызове метода execute происходит исключение, дело по всей видимости в ковычках в названиях потребителей (пример - "#_ООО "Акселерат"" - вызывает исключение, "Д/с "Дюймовочка" п. Новый" - не вызывает).

Поле NAME в таблице sql типа Text.

как организовать запрос, чтобы происходила корректная запись?
1 Fish
 
01.12.11
13:34
Используй двойные кавычки
2 sasha_mrg
 
01.12.11
13:36
я так понимаю, что так?

ТекстЗапроса = "INSERT INTO Abonents (ID, NAME) VALUES ("+ВыборкаПотребителей.Код+", """+ВыборкаПотребителей.Наименование+""")";

Если да, то данный вариант тоже вызывает исключение.
3 sda553
 
01.12.11
13:38
Насколько я помню, в MS SQL для строк используются ординарные кавычки, так что правильно было бы
ТекстЗапроса = "INSERT INTO Abonents (ID, NAME) VALUES ('"+ВыборкаПотребителей.Код+"', '"+ВыборкаПотребителей.Наименование+"')";
4 Широкий
 
01.12.11
13:40
"'"
5 sasha_mrg
 
01.12.11
13:40
Итак, вариант с "" вызывает исключение на всех вариантах, а вариант с ' всё также на потребителях, названия которых заканчиваются кавычками, например #_ООО "Акселерат".
6 Широкий
 
01.12.11
13:41
"INSERT INTO Abonents (ID, NAME) VALUES ('"+ВыборкаПотребителей.Код+"', '"+ВыборкаПотребителей.Наименование+"')";

С числовыми полями не забудь разделитель триад убрать
7 sda553
 
01.12.11
13:45
А теперь представим, что наименование потребителя случайно равно "' + select password from supersecretDB.accounts where name='Admin" вот весело то будет
8 sasha_mrg
 
01.12.11
13:46
'"+ВыборкаПотребителей.Наименование+"' при #_ООО "Акселерат" вызывает исключение Incorrect syntax near ''
9 Широкий
 
01.12.11
13:49
Добавь
ТекстЗапроса=СтрЗаменить(ТекстЗапроса,"""","''");
10 sasha_mrg
 
01.12.11
13:51
тоже самое исключение
11 Широкий
 
01.12.11
13:53
А так?

"INSERT INTO Abonents(ID, NAME) VALUES ('"+СтрЗаменить(ВыборкаПотребителей.Код,"'","""")+"','"+СтрЗаменить(ВыборкаПотребителей.Наименование,"'","""")+"')";
12 sasha_mrg
 
01.12.11
13:55
Тоже самое
13 Широкий
 
01.12.11
13:56
Посмотри тогда текст запоса в отладчике , на который ругается
14 sda553
 
01.12.11
13:57
Пожалуйста точно скопируйте сюда то, что лежит в переменной ТекстЗапроса
15 sda553
 
01.12.11
13:58
Двойные кавычки в строке не должны вызывать ошибку, только что набил
select 'dfedfd"fdfd'

и никакой ошибки не было
16 sda553
 
01.12.11
13:59
select '#_ООО "Акселерат"'
так же не вызвал ошибки
17 Fish
 
01.12.11
13:59
Чтобы не париться с кавычками сделай так:
строкаПараметров = "+ВыборкаПотребителей.Код+", "+ВыборкаПотребителей.Наименование+";
ТекстЗапроса = "INSERT INTO Abonents (ID, NAME) VALUES ("+СтрокаПараметров+")";
18 sasha_mrg
 
01.12.11
14:00
Единственное что наводит на странные мысли - при просмотре выборки запроса пошагово получаем

выборкапотребителей                                ВыборкаИзРезультатаЗапроса
Наименование                     "#_ООО "Акселерат""    Строка
Код                             1 232                    Число

большое количество " какое-то или это у меня уже предрассудки?
19 Fish
 
01.12.11
14:00
+(17) Плюсы только лишние скопипастил :)))
20 sasha_mrg
 
01.12.11
14:02
ТекстЗапроса = "INSERT INTO Abonents (ID, NAME) VALUES ("+ВыборкаПотребителей.Код+", '"+ВыборкаПотребителей.Наименование+"')";

то что лежит в СтрокаЗапроса полностью
21 sda553
 
01.12.11
14:02
(17) Да так вообще нельзя делать потому что (7)
надо что то типа
declare P1 int
set P1=1234
declare @P2 char(100)
set @P2='#_ООО "Акселерат"'

INSERT INTO Abonents (ID, NAME) VALUES (P1,@P2)
22 sda553
 
01.12.11
14:06
Блин пользователь с именем P1 затесался

declare @P3 int

set @P3=1234

declare @P2 char(100)
set @P2='#_ООО "Акселерат"'



INSERT INTO Abonents (ID, NAME) VALUES (@P3,@P2)
23 Fish
 
01.12.11
14:12
(21) в (7) конечно ситуация нетипичная, пользователь должон быть довольно продвинутым :)) Но, наверное, с точки зрения безопасности твой вариант правильнее
24 sasha_mrg
 
01.12.11
14:19
опять же, "#_ООО "Акселерат"" - вызывает исключение, "Д/с "Дюймовочка" п. Новый" - не вызывает
исключение такое же как и ранее
25 sasha_mrg
 
01.12.11
14:23
выглядит это примерно так

Пока ВыборкаПотребителей.Следующий() Цикл
           ТекстЗапроса = "declare @p1 int"
           "set @p1 ="+ ВыборкаПотребителей.код +
           "declare @p2 char(100)"
           "set @p2 ='"+ ВыборкаПотребителей.Наименование + "'"
           "INSERT INTO Abonents (ID, NAME) VALUES (@p1, @p2)";
           гКоннект.Execute(ТекстЗапроса);
       КонецЦикла;
26 sda553
 
01.12.11
14:36
Разделитель убери у кода, у тебя
set @p1 =1 232
а должно быть
set @p1 =1232