Версия для печати темы (https://pro1c.org.ua/index.php?s=021e17de23fd53dff93ac275c36f5438&showtopic=21231)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Неожиданное поведение. Как выполнить параметризированный SQL запрос?

Автор: twilight_dream 17.12.14, 14:49

Как выполнить параметризированный запрос? Что делаю не так.

    СтрокаПодключения = "driver=SQL Server;Server="+имяСервера+";Database=Mayer_central;User Id="+Логин+";Password="+Пароль+";";
    Connection = СоздатьОбъект("ADODB.Connection");
    Connection.Open(СтрокаПодключения);
    Command = СоздатьОбъект("ADODB.Command");
    Command.ActiveConnection = Connection;
    Command.CommandType = 1;    
    Command.Prepared = 1;
    Command.NamedParameters = 1;
    Сообщить ("Удачно подключились");
    //Грузим товары
    //1. Очистка таблицы
    ТекстЗапроса = "DELETE FROM tblProducts WHERE Product_Id<>@two ";    
    Command.CommandText = ТекстЗапроса;                              
    Product_Id =  command.CreateParameter("@two", 5, 1, , 0);
    command.Parameters.Append(Product_Id);
    command.Parameters.Item(0).Value  = 2;
    Command.Execute();

Выдается ошибка:
Microsoft OLE DB Provider for ODBC Drivers: [Microsoft][ODBC SQL Server Driver][SQL Server]Необходимо объявить скалярную переменную "@two".

судя по всему в данном случае дривер не понимает, что @two - это параметр. Попытки использовать вариации ":two" и "%two%" не привели к успеху.

Автор: alex040269 17.12.14, 14:57

может ?two

Автор: twilight_dream 17.12.14, 15:19

Цитата(alex040269 @ 17.12.14, 14:57) *
может ?two

Не ... в том то и удивительно, что всё синтаксически правильно.

Автор: alex040269 17.12.14, 15:54

Цитата(twilight_dream @ 17.12.14, 14:49) *
Product_Id = command.CreateParameter("@two", 5, 1, , 0);

тогда
Product_Id =  command.CreateParameter("two", 5, 1, , 0);

Автор: logist 17.12.14, 15:56

Вставляйте параметр явным текстом в запрос.

upd
или так

ТекстЗапроса = "DELETE FROM tblProducts WHERE Product_Id<> (@two)";    



Автор: twilight_dream 17.12.14, 16:33

Цитата(logist @ 17.12.14, 15:56) *
Вставляйте параметр явным текстом в запрос.

upd
или так
ТекстЗапроса = "DELETE FROM tblProducts WHERE Product_Id<> (@two)";    


Но по сути сложность запроса здесь не имеет значения. Если сработает этот, будет работать и тот. Надо пока с этим случаем разобраться. Почему не работает. Кстати, скобки ничего не дают вэтом плане.

Но пока мог бы и явно подставлять, только неясно что делать с наименованиями, в которых могут попадаться разные там спецсимволы и одинарные кавычки.

то есть на самом деле есть более сложные запросы, где рациональней использовать именно параметры.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua