Передача параметров в SP и обратно (из VB)
AlexanderVS
Дата: 22.01.2001 12:47:31
Есть на сервере хранимая процедура:
create proc ttt(@P1 int=0,@P2 int=0,P3 int=0, @P4 int=0)
as
.....
.....
return @R
Для ее выполнения (приложение на VB6) используется такой код:
......
cmCom.CommandType = adCmdText
cmCom.CommandText = "EXEC ttt @P1=50, @P4=150"
cmCom.Execute
.......
Все ОК, но никак не могу получить возвращаемый параметр.
cmdCom.Parameters(0).Value - остается пустым
Подскажите как тут быть. (Необходимо передовать только часть входных параметров).
Всех благ, Александр. (stulikov@rambler.ru)
AnKa
Дата: 22.01.2001 14:26:45
А что, нельзя оформить
create proc ttt(@P1 int=0,@P2 int=0,P3 int=0, @P4 int=0, @R int OUTPUT)
--------------!!
и потом брать результат из последнего Parameters.
Staple
Дата: 22.01.2001 15:41:29
Я для запуска сохр. процедуры и возвращения параметра написал небольшую функцию... вроде до сих пор не подводила.
Function execSProc(pwp As String) 'pwp - тот самый запрос, можно без exec в начале.
Dim cn As ADODB.Connection
Dim cmd As New ADODB.Command
Dim rs As ADODB.Recordset
Set cn = Application.CurrentProject.Connection
cmd.ActiveConnection = cn
cmd.CommandText = pwp
Set rs = cmd.Execute
execSProc = rs("result")
rs.Close
cn.Close
End Function
А сама процедура в общем виде выглядит так:
Create procedure pr1
@parm1 int,
@parm2 int,
...
As
SET NOCOUNT ON /*Не знаю, как в VB, а в Аксесе (VBA) без этого нельзя - он начнет жалобно скулить и ругаться*/
/* далее - набор эротичных телодвижений и, наконец, - */
SELECT [то_что_нужно] AS result
SET NOCOUNT OFF
Попробуй, здесь вроде у VBA и VB разницы быть не должно - может, и заработает!
SergSuper
Дата: 22.01.2001 15:46:17
Дело в следующем.
На сервер посылаются запросы, он же в ответ выплевывает таблицы выборок("резалты" по русски). Еще выдается информация о количестве обработанных строк, в Query Analizer это число пишется как (ХХХ row(s) affected). Больше никакого обмена данными НЕТ. Т.е. параметр в принципе обратно в клиентскую часть передаться не может. Не знаю как в VB, в Delphi есть специальный объект для выполнения запроса и специальный обыект для выполнения процедуры. Последний видит параметры, но это уже реализовано в клиентской части добавлением запроса типа "select @P4". Но этот механизм скрыт от программиста и ему представляется что параметры передаются через процедуры.
Павел
Дата: 22.01.2001 18:58:26
Незнаю как в Delphi, но сильно подозреваю что примерно тоже самое (говорим про ADO!), а в VB наиболее быстрый способ, корректно работающий как с входными так и с выходными параметрами заключается в том, чтобы клиент не запрашивал у сервера тип и имя параметра (т.е. все делается 'ручками'):
Create Procedure TestProc @Parameter1 Int, @Parameter2 Int, @Parameter3 Int Output
As
Set Nocount On
Set @Parameter3 = @Parameter1 + @Parameter2
Return
Dim cmd As New Command, prm As New Parameter
cmd.ActiveConnection = CurrentProject.Connection
cmd.CommandText = "TestProc"
cmd.CommandType = adCmdStoredProc
Set prm = cmd.CreateParameter("@Parameter1", adInteger, , , 123)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@Parameter2", adInteger, , , 456)
cmd.Parameters.Append prm
Set prm = cmd.CreateParameter("@Parameter2", adInteger, adParamOutput)
cmd.Parameters.Append prm
cmd.Execute
MsgBox prm
Set prm = Nothing
Set cmd = Nothing
Garya
Дата: 23.01.2001 21:56:59
Все нормально работат как в Delphi, так и в VBA. Нужно только не забыть три вещи:
1. В тексте SP возле соответсвующего параметра нужно указывать OUTPUT и не только в описании текста SP, НО И ПРИ ЕЕ ВЫЗОВЕ С ПОМОЩЬЮ EXEC.
2. Среди ADO-компонентов есть такие Parameters - они как раз и используются для передачи параметров, что в ту сторону, что обратно. Так вот у них есть свойство Direction (по крайней мере в Delphi оно так называется). Его нужно правильно выставить.
3. После вызова хранимой процедуры возвращаемый через параметр результат сам ни в какую ни в локальную, ни в глобальную переменную не попадает. Просто свойство объекта Parameter получает новое значение. Оттуда его и нужно считать.
Вот, собсно, и все
.