|   |   | 
| 
 | Получение результатов вызова хранимой процедуры | ☑ | ||
|---|---|---|---|---|
| 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 | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |