8.х ОБМЕН Передать параметры в функцию SQL из 1с

Тема в разделе "Обмен данными в "1С:Предприятие 8"", создана пользователем chernike, 16 фев 2015.

  1. TopicStarter Overlay
    chernike
    Offline

    chernike

    Регистрация:
    16 фев 2015
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Доброго времени суток.
    На sql есть функция, которая возвращает таблицу из двух колонок.
    в функции 4 параметра.
    Запускал ее через view со следующим кодом:
    SELECT *
    FROM dbo.RoundTime(@p1, @p2, @p3, @p4)
    p1 - строка
    p2,p3,p4 - число
    Открывалась форма,в которой я задавал параметры и все работало.
    в 1с реализовал следующее:
    Command = Новый COMОбъект("ADODB.Command");
    RecordSet = Новый COMОбъект("ADODB.RecordSet");
    Command.ActiveConnection = ADOСоединение;
    Param1 = Command.CreateParameter("@p1", 200, 1,100, параметр1;
    Command.Parameters.Append(Param1);
    Param2 = Command.CreateParameter("@p2", 3, 1, 50, параметр1);
    Command.Parameters.Append(Param2);
    Param3 = Command.CreateParameter("@p3", 3, 1, 50, параметр2);
    Command.Parameters.Append(Param3);
    Param4 = Command.CreateParameter("@p4", 3, 1, 50, параметр3);
    Command.Parameters.Append(Param4);
    Command.CommandText = " select * from dbo.RoundTime('"+ Param1 +"',"+param2+"','"+Param3 + "','"+ Param4+"')";
    RecordSet = Command.Execute();
    При execute вылетает ошибка:
    Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Ошибка преобразования значения varchar "COMОбъект" в тип данных int.
    Не могу понять как правильно передать параметры в функцию.
    Писал также вот так:
    Command.CommandText = " select * from dbo.RoundTime(@p1,@p2,@p3,@p4)";
    RecordSet = Command.Execute();
    При execute выдало сообщение Необходимо объявить скалярную переменную "@p1"
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Параметры задаются в запросе, в той последовательности, что добавляются в массив параметров.

    В общем случае будет так:
    Код:
    это VB, но суть от этого не меняется.
    oCmd.CommandText = "insert into tt (TT,P) values(?,?)"
    Set oPara1 = oCmd.CreateParameter("@TT_param", adInteger, adParamInput)
    Set oPara2 = oCmd.CreateParameter("@TT_param2", adInteger, adParamInput)
    oCmd.Parameters.Append oPara1
    oCmd.Parameters.Append oPara2
    oCmd.Parameters(0) = 123
    oCmd.Parameters(1) = "222"
    oCmd.Execute
    
  3. rshakiro
    Offline

    rshakiro Профессионал в 1С Команда форума

    Регистрация:
    17 мар 2011
    Сообщения:
    2.236
    Симпатии:
    144
    Баллы:
    104
    попробуйте изменить:
    Код:
    Command.CommandText = " select * from dbo.RoundTime('"+ Param1 +"',param2,Param3,Param4)";

    ЗЫ: изменил
    Последнее редактирование: 16 фев 2015
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    Нет, нет и еще раз нет! Это несусветная глупость пихать значения в текст запроса! А если надо передать массив элементов так на 1000?
  5. TopicStarter Overlay
    chernike
    Offline

    chernike

    Регистрация:
    16 фев 2015
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    Param1 = Command.CreateParameter("@p1", 200, 1,100);
    Command.Parameters.Append(Param1);
    Param2 = Command.CreateParameter("@p2", 3, 1, 50);
    Command.Parameters.Append(Param2);
    Param3 = Command.CreateParameter("@p3", 3, 1, 50);
    Command.Parameters.Append(Param3);
    Param4 = Command.CreateParameter("@p4", 3, 1, 50);
    Command.Parameters.Append(Param4);
    Command.Parameters(0).value = параметр1;
    Command.Parameters(1).value = параметр2;
    Command.Parameters(2).value = параметр3;
    Command.Parameters(3).value = параметр4;
    Command.CommandText = " select * from dbo.RoundTime(@p1,@p2,@p3,@p4)
    RecordSet = Command.Execute();
    Ошибка
    Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Необходимо объявить скалярную переменную "@p1".
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.554
    Симпатии:
    716
    Баллы:
    204
    ....если внимательно посмотреть на пример кода, то:
    Command.CommandText = " select * from dbo.RoundTime(@p1,@p2,@p3,@p4)
    превращается в
    Command.CommandText = " select * from dbo.RoundTime(?,?,?,?)
  7. TopicStarter Overlay
    chernike
    Offline

    chernike

    Регистрация:
    16 фев 2015
    Сообщения:
    13
    Симпатии:
    0
    Баллы:
    1
    спасибо,получилось

Поделиться этой страницей