Input/Output параметр для ADODB.Command

Chelyaba
Дата: 14.10.2003 13:24:32
Уважаемый ALL!
Столкнулся с неожиданным (для меня) поведением ADODB.Command
ADO - 2.7, MS SQL2k EE 3SP
есть таблица
CREATE TABLE _t (ID INT NOT NULL PRIMARY KEY, Value VARCHAR(20))

INSERT INTO _t
SELECT 1, '1' UNION ALL SELECT 2, '2' UNION ALL
SELECT 3, '3' UNION ALL SELECT 4, '4'

процедура:
CREATE PROCEDURE sp_ChangeTable(@ID INT OUTPUT, @Value VACHAR(20))

AS
SET NOCOUNT ON
IF @ID IS NULL BEGIN
SELECT @ID = ISNULL(MAX(ID), 0)+1 FROM _t
INSERT INTO _t VALUES (@ID, @Value)
END ELSE BEGIN
UPDATE _t SET Value = @Value WHERE ID = @ID
END
SET NOCOUNT OFF
GO

Вызывая эту процедуру из QA - получаю то, что хочу (добавление при @ID =NULL и изменение в противном случае).
Пытаюсь использовать для запуска SP ADODB.Command (Delphi):
  vID := 5;

vV := 'Test';
FCmd.CommandType := adCmdStoredProc;
FCmd.CommandText := 'sp_ChangeTable';
Param := FCmd.CreateParameter('@ID', adInteger, adParamInputOutput, 0, vID);
FCmd.Parameters.Append(Param);
Param := FCmd.CreateParameter('@Value', adVarChar, adParamInput, 50, vV);
FCmd.Parameters.Append(Param);
FCmd.Execute(VarRecsAffected, v, 0);

Для случая @ID=NULL получаю правильное поведение и несколько странный трэйс:
declare @P1 int

set @P1=5
exec sp_ ChangeTable @P1 output, 'Test'
select @P1

Для случая @ID=5 (такая запись в табл. есть) получаю добавление следующей записи и трэйс:
declare @P1 int

set @P1=6
exec sp_ ChangeTable @P1 output, 'Test'
select @P1


Я что-то неправильно делаю?
Спасибо.
pkarklin
Дата: 14.10.2003 13:36:15
Сначала не по теме. Почему бы вместо

  Param := FCmd.CreateParameter('@ID', adInteger, adParamInputOutput, 0, vID);

FCmd.Parameters.Append(Param);
Param := FCmd.CreateParameter('@Value', adVarChar, adParamInput, 50, vV);
FCmd.Parameters.Append(Param);


не сделать просто

FCmd.Parameters.Refresh;


И, а где собственно установка параметра в NULL и вызов процедуры, после чего получены соответствующие трейсы? Для 5 есть.
Chelyaba
Дата: 14.10.2003 13:42:24
Извиняюсь...
pkarklin писал:
И, а где собственно установка параметра в NULL и вызов процедуры,

  vID := NULL;

vV := 'Test';
...
FCmd.Execute(VarRecsAffected, v, 0);

при первом вызове...
А Parameters.Refresh я использовал... (с тем же результатом :( )
pkarklin
Дата: 14.10.2003 13:51:42
А Parameters.Refresh я использовал... (с тем же результатом :( )

То есть следующий код такие же трэйсы дает?

FCmd.CommandType := adCmdStoredProc;

FCmd.CommandText := 'sp_ChangeTable';
FCmd.Parameters.Refresh;
//первый вызов c NULL
FCmd.Parameters.ParamByName('@ID').Clear;
FCmd.Parameters.ParamByName('@Value').Value := 'Test';
FCmd.Execute(VarRecsAffected, v, 0);
//второй вызов c 5
FCmd.Parameters.ParamByName('@ID').Value = 5;
FCmd.Parameters.ParamByName('@Value').Value := 'Test';
FCmd.Execute(VarRecsAffected, v, 0);
Chelyaba
Дата: 14.10.2003 14:11:38
Извиняюсь!
Parameters.Refresh - помог (видимо вчера пиво хорошо пошло :).
Хотя трэйс для @ID=NULL остался тем же странным
declare @P1 int

set @P1=9
exec sp_ ChangeTable @P1 output, 'Test'
select @P1

Т.е., не совсем понятно, когда он успел эту 9 получить.

Для @ID=5 отработка правильная:
declare @P1 int

set @P1=5
exec sp_ ChangeTable @P1 output, 'Test5'
select @P1


В любом случае, спасибо.
pkarklin
Дата: 14.10.2003 14:16:31
Т.е., не совсем понятно, когда он успел эту 9 получить.

Если ты параметру @ID 9 ни где не присваивал, то действительно странно.
Chelyaba
Дата: 14.10.2003 14:29:05
Может кто знает откуда ADODB.Command получил следующий номер?
Профайлер у меня был с фильтром по NTUserName (и все).
Т.е. установка параметра и запуск
FCmd.Parameters.Item['@ID'].Value := NULL;

FCmd.Execute(VarRecsAffected, v, 0);

Выдал
set implicit_transactions on 


exec [DD]..sp_procedure_params_rowset N'sp_ChangeTable', 1, NULL, NULL

declare @P1 int
set @P1=10
exec sp_ ChangeTable @P1 output, 'Test'
select @P1

IF @@TRANCOUNT > 0 COMMIT TRAN
ZrenBy
Дата: 14.10.2003 14:33:10
Смотри не только :Completed, а и :Starting
увидишь там NULL