Имя: Пароль:
1C
1С v8
Параметры в запросе 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 назад так делали.