Имя: Пароль:
1C
1С v8
Получение результатов вызова хранимой процедуры
0 Tester
 
29.06.17
12:02
Всем привет. Есть код
Command = Новый COMОбъект("ADODB.Command");
Command.CommandTimeout = 100;
Command.ActiveConnection = АДОДБКоннект;
Command.CommandText = "p_Incomes2WblAuto";
Command.CommandType = 4;
Command.Parameters.Refresh();
Command.Parameters(1).Value = WayBillID;
Command.Execute();

Как получить значение другого исходящего параметра?
1 cw014
 
29.06.17
12:10
Command.Parameters(2).Value = ...? Не?
2 Tester
 
29.06.17
12:12
(1) какого-то лешего возвращает null
3 cw014
 
29.06.17
12:15
Может потому что первый параметр (0)?
4 cw014
 
29.06.17
12:15
А Command.Execute(); что возвращает?
5 cw014
 
29.06.17
12:15
Вроде бы результат в виде выборки приходит
6 Tester
 
29.06.17
13:43
Command.Execute() возвращает RecordSet, в котором RecordCount - ошибка чтения значения, Fields.Count = 0
7 AlexTim03
 
29.06.17
14:15
Надо на скуле объявить переменную.
Туда присвоить результат хранимки.
И выбрать

Как-то так (сорри за синтаксис, не помню точно):
sei perem
perem = exec p_Incomes2WblAuto
select perem

и результат тогда будет
8 Tester
 
30.06.17
16:02
В общем замучился я.
Процедура:
USE [tool]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[VladTest]
    @p1 varchar(20) out
AS
BEGIN
    SET NOCOUNT ON;
    select @p1 = 'орпопорплпрлрлп'
    select 'Труляля'
END

Код 1С:
Command = Новый COMОбъект("ADODB.Command");
Command.CommandTimeout = 100;
Command.ActiveConnection = АДОДБКоннект;
Command.CommandText = "VladTest";
Command.CommandType = 4;                         
Param = Command.CreateParameter("@p1", 200, 2, 20, "khk");
Command.Parameters.Append(Param);         
RS = Command.Execute();                
Пока RS.EOF() = 0 цикл
Сообщить(RS.Fields(0).value);            
RS.MoveNext();            
КонецЦикла;

Выдает "Труляля".
Но параметр прочитать не могу (
9 PiterPrg
 
30.06.17
16:09
Попробуй

@p1 nvarchar(20)

И попробуй сперва только английские буквы в хранимке
10 Вафель
 
30.06.17
16:19
а если делать через exec xP-name
11 Имитация работы
 
30.06.17
16:19
Зачем @ в CreateParameter("@p1" ?
12 vde69
 
модератор
30.06.17
16:19
сейчас пример дам работающий
13 vde69
 
модератор
30.06.17
16:21
Функция СоздатьПодключение_SQL(УзелЭтойБазы, УзелОбмена) Экспорт  
    COMОбъектSQL = Неопределено;
    СеансовыйКлюч = "";
    Попытка
        COMОбъектSQL = Новый COMОбъект("ADODB.Connection");
        COMОбъектSQL.ConnectionTimeOut    = 0;
        COMОбъектSQL.CommandTimeOut    = 0;
        COMОбъектSQL.ConnectionString    =
               "Driver={SQL Server}; SERVER="     + СокрЛП(УзелЭтойБазы.СерверОбмена)     + ";"
             + "Database="                         + СокрЛП(УзелЭтойБазы.БазаОбмена)     + ";"
             + "Uid="                             + СокрЛП(УзелЭтойБазы.ЛогинОбмена)     + ";"
             + "Pwd="                             + СокрЛП(УзелЭтойБазы.ПарольОбмена) + ";";
        COMОбъектSQL.Open();                          
        Если COMОбъектSQL.State() = 0 Тогда
            ВызватьИсключение "Не удалось подключиться к SQL";
        КонецЕсли;
        
        Command = Новый COMОбъект("ADODB.Command");
        Command.CommandTimeout = 100;
        Command.ActiveConnection = COMОбъектSQL;
        
        // проверяем дополнительный пароль и заполняем табличу текущего сеанса
        Command.CommandType = 4;
        Command.Parameters.Append(Command.CreateParameter("KeySource",  129, 1, 200,СокрЛП(УзелЭтойБазы.ИмяУзлаНаСервере)));                                
        Command.Parameters.Append(Command.CreateParameter("PassSource", 129, 1, 200,СокрЛП(УзелЭтойБазы.ПарольУзлаНаСервере)));                                
        Command.Parameters.Append(Command.CreateParameter("IDSession",  129, 2, 200));                                
        
        стрЗапрос = "Authorization";
        Command.CommandText = стрЗапрос;
        
        Command.Execute(стрЗапрос);
        СеансовыйКлюч = СокрЛП(Command.Parameters("IDSession").Value);

    Исключение
        COMОбъектSQL = Неопределено;
        ВызватьИсключение "Не удалось создать объект подключения к SQL: " + ОписаниеОшибки();
    КонецПопытки;
    
    Результат = Новый Структура;
    Результат.Вставить("COMОбъектSQL", COMОбъектSQL);
    Результат.Вставить("СеансовыйКлюч", СеансовыйКлюч);
    Результат.Вставить("УзелЭтойБазы", УзелЭтойБазы);
    Результат.Вставить("УзелОбмена", УзелОбмена);
    Результат.Вставить("ИмяЭтогоУзла", УзелЭтойБазы.ИмяУзлаНаСервере);
    Результат.Вставить("ИмяУзлаОбмена", УзелОбмена.ИмяУзлаНаСервере);
    
    Возврат Результат;      
КонецФункции
14 Tester
 
30.06.17
16:35
(13) спасибо, но делаю точно так же, а Command.Parameters("IDSession").Value равно Неопределено.
Что за ерунда?
15 PiterPrg
 
30.06.17
17:09
После

Command.Execute()

Чему равен

Command.Parameters(0).Value
16 PiterPrg
 
30.06.17
17:11
(15) Или даже вот так: Command.Parameters.Item(0).Value
17 vde69
 
30.06.17
20:08
(14) у тебя хранимака с ОДНИМ выходным параметром !!!!


пробуй

        Command = Новый COMОбъект("ADODB.Command");
        Command.CommandTimeout = 100;
        Command.ActiveConnection = АДОДБКоннект;
        Command.CommandType = 4;
        стрЗапрос = "VladTest";  // НЕ УДАЛЯТЬ !!!                
        Command.CommandText = стрЗапрос;
        Command.Execute(стрЗапрос);
        Хрень = СокрЛП(Command.Parameters("p1").Value);
18 Tester
 
04.07.17
09:48
(17) после
        Command.Execute(стрЗапрос);
вылетает в исключение с ошибкой
Procedure or function 'VladTest' expects parameter '@p1', which was not supplied.
19 Tester
 
04.07.17
09:51
А не...
20 Tester
 
04.07.17
10:56
В общем нет правды в этой жизни.
Результаты тестов:

// Не работает, после строки Command.CommandText = "VladTest"; параметров для установки нет,
// а Command.Execute(); выдает ошибку: Procedure or function 'VladTest' expects parameter '@p1', which was not supplied.
Command = Новый COMОбъект("ADODB.Command");
Command.CommandTimeout = 100;
Command.ActiveConnection = АДОДБКоннект;                
Command.CommandText = "VladTest";
Command.CommandType = 4;        
//Command.Parameters("@p1").Value = "ываываывавы";
Command.Execute();
        
// Работает, после строки Command.CommandText = "VladTest"; становятся доступными для установки параметры,
// а после Command.Execute(); в них есть возвращаемые данные
Command = Новый COMОбъект("ADODB.Command");
Command.CommandTimeout = 100;
Command.ActiveConnection = АДОДБКоннект;                
Command.CommandType = 4;
Command.CommandText = "VladTest";
Command.Parameters("@p1").Value = "ываываывавы";
Command.Execute();
                
// Не работает, Command.Parameters("@p1").Value возвращает Неопределено
Command = Новый COMОбъект("ADODB.Command");
Command.CommandTimeout = 100;
Command.ActiveConnection = АДОДБКоннект;
Command.CommandText = "VladTest";
Command.CommandType = 4;                        
Param = Command.CreateParameter("@p1", 200, 2, 20);
Command.Parameters.Append(Param);        
RS = Command.Execute();
        
// Работает, Command.Parameters("@p1").Value возвращает данные
Command = Новый COMОбъект("ADODB.Command");
Command.CommandTimeout = 100;
Command.ActiveConnection = АДОДБКоннект;
Command.CommandText = "VladTest";
Command.CommandType = 4;                        
Param = Command.CreateParameter("@p1", 200, 2, 20);
Command.Parameters.Append(Param);        
Command.Execute();

// Всем спасибо за помощь!
21 Tester
 
04.07.17
11:09
Теперь еще один косяк: можно получить либо результат выполнения процедуры через (RS = Command.Execute();), но не получить параметры либо получить выходные параметры через (Command.Execute();), но тогда не можем получить результат выполнения процедуры.
Как получить и выходной RS и данные из выходных параметров? o_O
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс