Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.033 c
6-1096557772
Ig
2004-09-30 19:22
2004.12.05
Статьи по компонентам Indy ( TIdTCPServer,TIdUDPServer)


6-1096118529
Шишкин Илья
2004-09-25 17:22
2004.12.05
Как определить, доступен ли компьютер в LAN


4-1098023519
#Мастер#
2004-10-17 18:31
2004.12.05
Hook на всё


1-1100772457
keymaster
2004-11-18 13:07
2004.12.05
Проблема с округлением


3-1099464032
SergP
2004-11-03 09:40
2004.12.05
Получить номер строки DbGrid в событии DrawColumnCell





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский