|
Проблемы с кавычками в запросе из 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
|
||||
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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |