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