Форум: "Базы";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Вниз"Двойной" вызов ХП Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.053 c