Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Параметры в запросе SQL

Параметры в запросе SQL
Я
   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();
 
 
   ИС-2
 
1 - 17.02.20 - 10:22
самому интересно...

Я просто менял текст запроса. Например, dbo.Order.Number = "123"
   catena
 
2 - 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();
   grasshoper
 
3 - 17.02.20 - 10:31
(2) А имена параметров как задаёте?
   grasshoper
 
4 - 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 = /users.php?id=10560" target="_blank" class="registered-user">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
И .. не понимаю этого онаниз..ма с параметрами адо в простых запросах.
Гораздо проще сам текст запроса слепить динамически как угодно.
   bolero
 
7 - 17.02.20 - 13:38
(6) за это 1с-ников за программистов и не держат

что людям безопасная работа и возможность поддержки в будущем - то ему онанизм
   Ёпрст
 
8 - 17.02.20 - 13:47
(7) Так..и в чем безопасность в установке параметров ?
   NorthWind
 
9 - 17.02.20 - 14:00
(8) инъекцию сложнее сделать путем изменения кода запроса
   NorthWind
 
10 - 17.02.20 - 14:03
В параметр ничего не передать кроме данных. А когда выражение лепится из частей, в часть можно вписать необязательно данные, но и иньектировать ещё одно выражение, скажем, на дроп всех таблиц или ещё на что-то деструктивное.
   080808Ник
 
11 - 17.02.20 - 14:08
(10) То есть если у нас скуль запрос - Выбрать документ из докменты где ссылка=&Ссылка я заменю ссылка на делет фром то скуль меня не пошлет?
   grasshoper
 
12 - 17.02.20 - 14:09
Короче никто не знает. Ну ладно, где там мои костыли...
   NorthWind
 
13 - 17.02.20 - 14:14
(11) если у вас в форме ожидается ввод 1, а юзер напишет 1;delete from important_data;commit; то в некоторых СУБД да, это может прокатить, если вы не пользуетесь параметрами.
   NorthWind
 
14 - 17.02.20 - 14:16
И не раз прокатывало. Есть более сложные и более надёжные варианты инъекций.
   NorthWind
 
15 - 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" и о чудо ..никакой безопасности
   NorthWind
 
18 - 17.02.20 - 14:23
(17) нет, это не сработает. Именно в этом прелесть параметров, что с ними это не сработает. Ваша строка передастся так как будто она взята в кавычки и произойдет сравнение с ней, в результате запрос просто скорее всего вернёт пустоту.
   Ёпрст
 
19 - 17.02.20 - 14:25
(18) ну да..
та и пофик. В данном случае, параметр нафик не нужен ожин хрен
   grasshoper
 
20 - 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
   NorthWind
 
23 - 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 все то же самое.
   NorthWind
 
24 - 17.02.20 - 20:43
т.е. работает если начинать параметр с двоеточия. Это в принципе стандартное олдскульное именование параметров в SQL, в оракле еще лет 20 назад так делали.


Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь во втором сообщении вам дадут решение, а в двадцатом дадут правильное решение. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.