Хорошо, это кудрявый. Я работаю над кодом Delphi, который не написал, и столкнулся с очень странной проблемой. Один из параметров моих хранимых процедур отображается как null
, хотя он определенно отправляется 1
.
Код Delphi использует TADOQuery для выполнения хранимой процедуры (анонимно):
ADOQuery1.SQL.Text := "exec MyStoredProcedure :Foo,:Bar,:Baz,:Qux,:Smang,:Jimmy";
ADOQuery1.Parameters.ParamByName("Foo").Value := Integer(someFunction());
// other parameters all set similarly
ADOQuery1.ExecSQL;
Integer(SomeFunction())
в настоящее время всегда возвращает 1 - я проверил с помощью отладчика.
Тем не менее, в моем хранимом процессе (изменено в целях отладки):
create procedure MyStoredProcedure (
@Foo int, @Bar int, @Baz int,
@Qux int, @Smang int, @Jimmy varchar(20)
) as begin
-- temp debug
if ( @Foo is null ) begin
insert into TempLog values ( "oh crap" )
end
-- do the rest of the stuff here..
end
TempLog
действительно заканчивается «о, дерьмо» (дополнительный вопрос: должен быть лучший способ отладки хранимых процедур: что это?).
Вот пример трассировки от профилировщика:
exec [MYDB]..sp_procedure_params_rowset N'MyStoredProcedure',1,NULL,NULL
declare @p3 int
set @p3=NULL
exec sp_executesql
N'exec MyStoredProcedure @P1,@P2,@P3,@P4,@P5,@P6',
N'@P1 int OUTPUT,@P2 int,@P3 int,@P4 int,@P5 int,@P6 int',
@p3 output,1,1,1,0,200
select @p3
Это выглядит немного странно для меня. Обратите внимание, что он использует @ p3 и @ P3 - может ли это быть причиной моей проблемы?
Другая странная вещь заключается в том, что, похоже, это зависит от того, какой TADOConnection я использую.
Проект представляет собой dll, которому передается TADOConnection из другого приложения. Вызывает все хранимые процедуры, использующие это соединение.
Если вместо использования этого соединения я сначала сделаю это:
ConnectionNew := TADOQuery.Create(ConnectionOld.Owner);
ConnectionNew.ConnectionString := ConnectionOld.ConnectionString;
TADOQuery1.Connection := ConnectionNew;
Тогда проблема не возникает! След от этой ситуации таков:
exec [MYDB]..sp_procedure_params_rowset N'MyStoredProcedure',1,NULL,NULL
declare @p1 int
set @p1=64
exec sp_prepare @p1 output,
N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 varchar(20)',
N'exec MyStoredProcedure @P1,@P2,@P3,@P4,@P5,@P6',
1
select @p1
SET FMTONLY ON exec sp_execute 64,0,0,0,0,0,' ' SET FMTONLY OFF
exec sp_unprepare 64
SET NO_BROWSETABLE OFF
exec sp_executesql
N'exec MyStoredProcedure @P1,@P2,@P3,@P4,@P5,@P6',
N'@P1 int,@P2 int,@P3 int,@P4 int,@P5 int,@P6 varchar(20)',
1,1,1,3,0,'400.00'
К сожалению, это немного для меня. Какие параметры TADOConnection могут влиять на это?
У кого-нибудь есть идеи?
Редактировать: Обновление ниже (больше не хотел задавать этот вопрос: P)