|
Параметры в запросе SQL | ☑ | ||
---|---|---|---|---|
0
grasshoper
17.02.20
✎
09:56
|
Кто знает как передавать параметры SQL запроса при подключении из 1С? Параметры записываю в виде @ИмяПараметра но не работает.
Пример: СоединениеSQL = Новый COMОбъект("ADODB.Connection"); КомандаSQL = Новый COMОбъект("ADODB.Command"); ВыборкаSQL = Новый COMОбъект("ADODB.RecordSet"); СоединениеSQL.ConnectionString = СтрокаСоединения; //Открытие соединения СоединениеSQL.Open(); КомандаSQL.ActiveConnection = СоединениеSQL; // Создаем параметр ПараметрSQL = КомандаSQL.CreateParameter(СтрокаПараметра.ИмяПараметра, КодТипаПараметра, КодВидаПараметра, МаксДлинаТипаПараметра, ЗначениеПараметра); // Добавляем параметр в список параметров КомандаSQL.Parameters.Append(ПараметрSQL); КомандаSQL.Prepared = ИСТИНА; КомандаSQL.CommandText = ТекстSQLЗапроса; ВыборкаSQL = КомандаSQL.Execute(); |
|||
1
ИС-2
naïve
17.02.20
✎
10:22
|
самому интересно...
Я просто менял текст запроса. Например, dbo.Order.Number = "123" |
|||
2
catena
17.02.20
✎
10:28
|
Я задаю значение отдельно, работает:
Command.CommandText = ТЗ; Command.CommandType = 4; Command.NamedParameters = Истина; Параметр = Command.CreateParameter("p_tab_num",129,1,10); Command.Parameters.append(Параметр); Command.Parameters(0).Value = Лев(Строка1С.ТабельныйНомер,10); Command.Execute(); |
|||
3
grasshoper
17.02.20
✎
10:31
|
(2) А имена параметров как задаёте?
|
|||
4
grasshoper
17.02.20
✎
11:37
|
// Не прокатило
SELECT PERSONAL_NO AS TAB, FIO AS FIO, BORN_DATE AS DROJD, COUNTRY_NAME AS OBLAST FROM dbo.PERSONAL_DATA_VIEW WHERE PERSONAL_NO = ? // Тоже не прокатило SELECT PERSONAL_NO AS TAB, FIO AS FIO, BORN_DATE AS DROJD, COUNTRY_NAME AS OBLAST FROM dbo.PERSONAL_DATA_VIEW WHERE PERSONAL_NO = Tab // Также не прокатило SELECT PERSONAL_NO AS TAB, FIO AS FIO, BORN_DATE AS DROJD, COUNTRY_NAME AS OBLAST FROM dbo.PERSONAL_DATA_VIEW WHERE PERSONAL_NO = :Tab // Вывод: // Как быть с параметрами |
|||
5
Ёпрст
17.02.20
✎
12:04
|
||||
6
Ёпрст
17.02.20
✎
12:08
|
И .. не понимаю этого онаниз..ма с параметрами адо в простых запросах.
Гораздо проще сам текст запроса слепить динамически как угодно. |
|||
7
bolero
17.02.20
✎
13:38
|
(6) за это 1с-ников за программистов и не держат
что людям безопасная работа и возможность поддержки в будущем - то ему онанизм |
|||
8
Ёпрст
17.02.20
✎
13:47
|
(7) Так..и в чем безопасность в установке параметров ?
|
|||
9
NorthWind
17.02.20
✎
14:00
|
(8) инъекцию сложнее сделать путем изменения кода запроса
|
|||
10
NorthWind
17.02.20
✎
14:03
|
В параметр ничего не передать кроме данных. А когда выражение лепится из частей, в часть можно вписать необязательно данные, но и иньектировать ещё одно выражение, скажем, на дроп всех таблиц или ещё на что-то деструктивное.
|
|||
11
080808Ник
17.02.20
✎
14:08
|
(10) То есть если у нас скуль запрос - Выбрать документ из докменты где ссылка=&Ссылка я заменю ссылка на делет фром то скуль меня не пошлет?
|
|||
12
grasshoper
17.02.20
✎
14:09
|
Короче никто не знает. Ну ладно, где там мои костыли...
|
|||
13
NorthWind
17.02.20
✎
14:14
|
(11) если у вас в форме ожидается ввод 1, а юзер напишет 1;delete from important_data;commit; то в некоторых СУБД да, это может прокатить, если вы не пользуетесь параметрами.
|
|||
14
NorthWind
17.02.20
✎
14:16
|
И не раз прокатывало. Есть более сложные и более надёжные варианты инъекций.
|
|||
15
NorthWind
17.02.20
✎
14:18
|
(12) на vbs под ado+jet делал, работало. Надо?
|
|||
16
Ёпрст
17.02.20
✎
14:19
|
(13) ага, только какое это отношение имеет к (0) ?
|
|||
17
Ёпрст
17.02.20
✎
14:21
|
(13) и по этой логике, если ожидается передача параметром строки, то ничто не мешает передать в параметр строку ";drop database" и о чудо ..никакой безопасности
|
|||
18
NorthWind
17.02.20
✎
14:23
|
(17) нет, это не сработает. Именно в этом прелесть параметров, что с ними это не сработает. Ваша строка передастся так как будто она взята в кавычки и произойдет сравнение с ней, в результате запрос просто скорее всего вернёт пустоту.
|
|||
19
Ёпрст
17.02.20
✎
14:25
|
(18) ну да..
та и пофик. В данном случае, параметр нафик не нужен ожин хрен |
|||
20
grasshoper
17.02.20
✎
14:29
|
(15) да мне просто нужно узнать как в тексте запроса обозначить параметр и как в него потом передать значение.
// За незнанием пришлось сделать так SELECT PERSONAL_NO AS TAB, FIO AS FIO, BORN_DATE AS DROJD, SUBSTRING(COUNTRY_NAME, 1, 40) AS OBLAST FROM dbo.PERSONAL_DATA_VIEW WHERE FIO LIKE @Names //////////////////////////////// // Приводим значение параметра к SQL виду ... // Подстановка значения параметра ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "@" + СтрокаПараметра.ИмяПараметра, ЗначениеПараметра); |
|||
21
Ёпрст
17.02.20
✎
14:37
|
(20) на вот как пример
http://catalog.mista.ru/public/90126/ |
|||
22
Ёпрст
17.02.20
✎
14:39
|
ну или вот
v8: Помогите передать параметры в запрос при подключении по ADO в поиске полно тем с параметрами ADO |
|||
23
NorthWind
17.02.20
✎
20:39
|
Вот до кучи, правда, язык оффтопный.
' Типы параметров ADO const adTypeGUID = 72 const adTypeInteger = 3 const adTypeBoolean = 11 const adTypeDateTime = 7 const adTypeVarChar = 200 ' ----------------------------------------------------------------------------------------- ' Обертка для правильной привязки адошных параметров ' Sub AssignADOParam (Cmd, ParType, ParName, ParValue, ParDirection) on error resume next Set Param = Cmd.Parameters.Item (ParName) if err then ' Была ошибка, т.е. параметр не найден - создаем новый Cmd.Parameters.Append _ Cmd.CreateParameter (ParName, ParType, ParDirection, 0, ParValue) else ' Параметр найден Param.Type = ParType Param.Direction = ParDirection Param.Value = ParValue end if End Sub ' ----------------------------------------------------------------------------------------- ' Создаем ADO команду ' Function CreateCommand (CommandText) Set cmd = CreateObject ("ADODB.Command") cmd.ActiveConnection = acMain cmd.CommandText = CommandText Set CreateCommand = cmd End Function ... ' Пример для рекордсета Set cmdFirmSetup = CreateCommand ("select * from FIRMS where ID=:FIRMID") Set rsFirmSetup = CreateObject ("ADODB.Recordset") AssignADOParam cmdFirmSetup, adTypeInteger, ":FIRMID", FirmID, 1 rsFirmSetup.Open cmdFirmSetup, , 3, 1, 1 ... ' Пример для команды Set cmdInsPos = CreateCommand ("insert into FILES (VGUID, FILENAME) values (:VGUID, :FILENAME)") AssignADOParam cmdInsPos, adTypeGUID, ":VGUID", BraceGUID(DocGUID), 1 AssignADOParam cmdInsPos, adTypeVarChar, ":FILENAME", FileName, 1 cmdInsPos.Execute Все параметры нормально привязываются и работают. База Jet, но полагаю, для MSSQL все то же самое. |
|||
24
NorthWind
17.02.20
✎
20:43
|
т.е. работает если начинать параметр с двоеточия. Это в принципе стандартное олдскульное именование параметров в SQL, в оракле еще лет 20 назад так делали.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |