Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

"Двойной" вызов ХП   Найти похожие ветки 

 
KSergey ©   (2004-11-04 13:16) [0]

ADODataSet
Записан след. запрос (схематично):

DECLARE @r int
DECLARE @e varchar(100)

EXEC @r = spMyProc 1, 2, @e OUTPUT  -- считаем, что параметры тут верны

SELECT @r, @e


Что в программе

ADODataSet1.Close;
ADODataSet1.CommandText := то, что выше;
ADODataSet1.Open;


Что происходит:

хранимка вызывается 2 (!!) раза.
Как установлено: в ней ведется лог вызовов. Происходит это не всегда: первые 2 раза (вызова приведенного кода) - по по два, потом по одному.

Да еще по разному на разных серверах. Короче бред полный. В QueryAnalizer"е все отлично (по одному разу вызов, как и ожидалось). Если бы не этот лог -  ничего бы и не заметил никогда, а тут...

Может кто сталкивался с подобным? Может какие параметры где покрутить? Я покрутил вроде все (у DataSet) - но ничего не изменилось. Курсор - клиентский.

Через ADOConnection.Execute - все работает нормально (как и ожидалось - 1 раз).

Все апдейты на дельфи установлены.


 
KSergey ©   (2004-11-04 15:04) [1]

Тут выяснилась еще деталь: это происходит только когда ХП вызывается с другого сервера (RPC)


 
sniknik ©   (2004-11-04 15:31) [2]

а если через  
ADOCommand.CommandTex  := то, что выше;
ADOCommand.Execute;
?
и если так результат получать
ADODataSet1.Recordset:= ADOCommand.Execute.NextRecordset(EmptyParam); {вроде второй в пакете нужен}
?


 
KSergey ©   (2004-11-04 15:45) [3]

> [2] sniknik ©   (04.11.04 15:31)
> а если через  
> ADOCommand.CommandTex  := то, что выше;
> ADOCommand.Execute;

Пробовал. Та же фигня. (сейчас специально проверил еще раз)
И через ADOQuery пробовал... (ну это уже так, с горя)

Причем через ADOCommand - стабильно 2 раза, через ADODataSet.Open - например так: 2  2  1 1 1 1...

Короче идиотизм.

Сделал я, сотоварисч, другой сотоварисч. Результат одинаков (ну в смысле я к тому, что врятли уже скрытые какие-то моменты, т.к. хоть и делали одно, но каждый сам, с нуля).

Единственное как что удалось сделать (тьфу-тьфу) - через ADOConnection.Execute

Опять же на одном сервере (без RPC в смысле) - все отлично. На RPC - такая вот фигня. Пары серверов использовали разные - результат одинаков (в плане неоднократности вызова).


 
sniknik ©   (2004-11-04 16:00) [4]

> Пробовал. Та же фигня. (сейчас специально проверил еще раз)
не помню уже, давно и мельком читал о проблеме с параметрами в адо компанентах (вроде именно к D5 относилось), там вроде тоже про попторные вызовы (вроде при prepare делалось для определения параметров ...) в общем смутно все и возможно неправда, но всетаки...
попробуй у ParamCheck ппоставить в фалсе
ADOCommand.ParamCheck := false;
ADOCommand.CommandTex := то, что выше;
ADOCommand.Execute;
изменится чтото?


 
KSergey ©   (2004-11-04 16:46) [5]

> [4] sniknik ©   (04.11.04 16:00)
> попробуй у ParamCheck ппоставить в фалсе
> ADOCommand.ParamCheck := false;

Пробовал и это ;) Про ParamCheck я тоже подумал, вдруг, думаю, вызывает для проверки. Но не помогло, увы...

И, что страно, "двоение" возникает только при старте проги. Потом (после 2-х вызовов) все становится нормально... (хотя есть вариации с другими компонентами, когда это постоянно)

Хотя сейчас попробовал код:

ADOCommand1.ParamCheck := FALSE;
ADOCommand1.CommandText := s;
ADOCommand1.ParamCheck := FALSE;
rst := ADOCommand1.Execute;


происходит "занятно": 1  2  1 1 1 ...

Еще из наблюдений: остановка в ADOConnection.WillExecute происходит как и положено 1 раз. И код вызова там один ;)
Занятно так же, что "двоение" происходит именно во время Open/Execute, т.е. ни при коннекте (когда какие-нибудь параметры могли бы чекаться), ни при изменении параметрров - нет...


 
sniknik ©   (2004-11-04 18:17) [6]

:о(
осталось одно, радикальное средство, сменить D5 на хотя бы D6 + апдейты ADO? или сразу D7. (50/50 поможет ;о))


 
ЮЮ ©   (2004-11-05 06:35) [7]

>И, что страно, "двоение" возникает только при старте проги. Потом (после 2-х вызовов) все становится нормально... (хотя есть вариации с другими компонентами, когда это постоянно)

А может, "двоение" возникает всё же не на сервере, а в программе, т.е. дважды выполняется код

ADODataSet1.Close;
ADODataSet1.CommandText := то, что выше;
ADODataSet1.Open;


 
KSergey ©   (2004-11-05 07:27) [8]

> [7] ЮЮ ©   (05.11.04 06:35)
> А может, "двоение" возникает всё же не на сервере, а в программе,
> т.е. дважды выполняется код

Ну разумеется, такое подозрение было. Как проверял:

1) вставил обработчик ADOConnection.WillExecute. Происходит 1 раз. Ну разве что тут можно возразить, что где-то коннект мимо этого ADOConnection идет... Ну тут можн оодно только возразить: в 3-х разных программах троих разных человек - ну не могло быть одинакового косяка.

2) да просто точка останова/ShowMessage в этот код.



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
4-1098437577
Slonco
2004-10-22 13:32
2004.12.05
Как сделать чтобы форма получила фокус и стала поверх другх окон?


3-1099982571
diabolik_krsk
2004-11-09 09:42
2004.12.05
Удаление записей из подчиненной таблицы


4-1098344748
Klopan
2004-10-21 11:45
2004.12.05
Реестр


14-1100512027
Dmitriy O.
2004-11-15 12:47
2004.12.05
Россия отдаст острова Японии !


1-1100767996
doma
2004-11-18 11:53
2004.12.05
ToolWindow из Dllины