|
|
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
6.5 Есть хранимая процедура, в ней открывается курсор на обновление. Если запускать в ЕМ, то все работает правильно, в цикле происходит перемещение по всем записям курсора, и все записи обновляются правильно. Если же запускать ее из клиента (VB6), то процедура работает неправильно. Обновляются не все записи, причем они всегда идут подряд и с конца. Например, последние 3 записи, а в другой раз может 2 или 5. Такое ощущение, что цикл выполняется не до конца, и заканчивается до того как обработана последняя запись. Причем, никогда не обновляются все записи. Обязательно несколько последних остается необновленными. Из клиента запускаю процедуру следующим образом Dim MyConnection as new ADODB.Connection .......... MyConnection.Execute("MyProc param1, param2") Сообщений об ошибках нет. В ЕМ процедура работает всегда, так как и должна. В процедуру нет никаких сравнений со значением getdate(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.10.2002, 19:24:36 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
Плиз, помогите. База рабочая, позарез надо. Не могу же я на работу в 6-00 приходить каждый день, чтоб эти несколько записей обновить как надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 00:28:06 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
Два варианта: 1. Cамостоятельно трассируете (вроде в 6 было приложение SQL Tracer?) вызовы из VB 2. Приводите код процедуры Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 01:31:25 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
Попробуй STATIC-курсор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 09:48:01 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
А как у вас с ORDER BY в курсоре дела обстоят? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:06:54 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
А для этого куска кода мож DB-libriry -использовать?(не помню как точно пишется?) Всё равно не собираешься уходить с 6.5 :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:10:57 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
Для процедуры, очевидно, всё равно, откуда запускать. Я думаю, причина - разные настройки коннекта. Выясните их в вашем приложении и в QA. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:13:00 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
а не может быть так.... что когда вы запускаете процу из QA вы работаете с базай один.... а когда из приложения то работают еще люди.... может тип курсора не тот..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 10:17:41 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
CREATE PROCEDURE sp_ChangePathDateCopyer(@DateStart char(8)) AS if (not exists (SELECT ID FROM PathCopyer WHERE DateFrom=@DateStart OR DateTo=@DateStart)) BEGIN DECLARE UpdateCursor CURSOR FOR SELECT ID, DateFrom, DateTo FROM PathCopyer WHERE DateFrom <> null OR DateTo <>NULL ORDER BY ID OPEN UpdateCursor FETCH UpdateCursor WHILE @@Fetch_Status=0 begin UPDATE PathCopyer SET DateFrom=case DateFrom when null then null else @DateStart end, DateTo=case DateTo when null then null else @DateStart end WHERE CURRENT OF UpdateCursor FETCH UpdateCursor END CLOSE UpdateCursor DEALLOCATE UpdateCursor END ID - ключевое поле, по началу в курсоре его не было (кластеред), но вычитал, что лучше его использовать, потому что без него не известно какое поле выберет сервер для упорядочивания перемещений по записям курсора в цикле. Я думал, что это поможет, потому как в курсоре обновляются оба поля DateFrom и DateTo, одно из которых точно и использовалось для упорядочивания. Не помогает, результат прежний. Плиз, очень нужно разобраться! Да, еще такой момент. Теперь перестали именно обновляться конкретные записи, 7 последних записей. Последних, это если их выводить запросом с ORDER BY ID, т.е. в таком же порядке как по ним перемещается курсор. Или он не в таком порядке перемещается? 4 akuz ORDER BY тоже не помог 4 dao Что ж мне и OLEDB и ADO использовать сразу. Нехочется так. Да и зачем? Ведь все, что OLEDB позволяет можно сделать с помощью T-SQL (так мне кто-то когда-то ответил на вопрос и это так и есть) 4 MiCe Дело обстоит так. Эта процедура запускается один раз в сутки, в 00-00. В это время у нас на работе никого как бы нет. Соединение с БД может быть только одно (одна клиентская часть болтается на сервере). Это и поддтверждают логи, что после рабочего дня никаких коннектов к базе не происходит. Когда я все это запускал я отрубал всех от БД и закрывал им к ней доступ. Просто засунуть эту процедуру в шедулер на сервере не могу. Запуском этой процедуры должен управлять человек из клиентской части, который не может управлять ее выполнением через шедулер. Т.е. не факт, что нужно обязательно каждый день в 00-00, может сегодня запускать, а потом пару дней нет. Ужас, сегодня опять пришлось вручную все обновлять =( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 14:16:50 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
а зачем здесь курсор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 14:23:22 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
такая конструкция не подходит? BEGIN TRAN UPDATE PathCopyer SET DateFrom =@DateStart WHERE DateFromIs Not Null UPDATE PathCopyer SET DateTo =@DateStart WHERE DateFromIs Not Null COMMIT TRAN ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 14:30:27 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
4 Nickolay Просто ситуация такая, что на PathCopyer висит триггер на insert и update, который проверяет какое количество записей обновляется. Если >1, то делает откат, тем самым не давая обновить сразу несколько записей. Такова логика приложения, и думаю, что нельзя ее назвать неправильной. По его логике обновление нескольких записей сразу не должно проходить. Если апдейт обновляет только одну запись, то он должен проходить, иначе (если нужно обновить несколько записей) только курсором. В тригере происходит некоторая обработка записей, причем она не может работать с выборкой, а только с одной записью. Не буду описывать, что да как, просто примите это как факт, что можно сделать только так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 14:56:29 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
это триггер на апдейт CREATE TRIGGER ut_PathCopyer ON dbo.PathCopyer FOR UPDATE AS IF (@@ROWCOUNT<>1) ROLLBACK ELSE IF (UPDATE(PathFrom) OR UPDATE(DateFrom) OR UPDATE(PathTo) OR UPDATE(DateTo) OR UPDATE(Op)) AND (NOT Update(IDDeleted) AND NOT Update(OpOrder)) BEGIN DECLARE @MaxIDDeleted int SELECT @MaxIDDeleted=isnull(max(ID),0)+1 FROM DeletedPathCopyer UPDATE PathCopyer SET IDDeleted=@MaxIDDeleted WHERE ID=(SELECT ID FROM INSERTED) INSERT DeletedPathCopyer (ID,PathFrom,DateFrom,PathTo,DateTo,Op) SELECT @MaxIDDeleted,PathFrom,DateFrom,PathTo,DateTo,Op FROM INSERTED END GO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 15:29:37 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
и в DeletedPathCopyer получается что-то вроде архива в записей PathCopyer ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 15:33:13 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
понимает ли 6.5 такой синтаксис как alter table tablename disable trigger triggername если понимает - то выключите его и сделайте как пишет Nickolay + алгоритм триггера.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 15:41:03 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
Не знаю в чём корень Вашего зла кроится но вот выражение в SP: DateFrom <> null OR DateTo <>NULL На мой взгляд однозначно надо поменять на: DateFrom is not null OR DateTo is not NULL A то как то неоднозначно получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 15:44:15 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
4 MiCe Я уже с этим сталкивался, 6.5, помоему, такого не понимает, толко удаление и после опять создание тригера. Но вопрос не в том как обойти триггер, а как правильно заставить работать курсор. Может быть alexeyvg по поводу настроек сервера и клиента объяснит поконкретнее, что имеется ввиду? Параметры ADODB.Connection? 4 Alex_B В WHERE без разницы, что <>NULL, что is not NULL. Тут скорее неоднозначно можно воспринять null и NULL =) Может и в заправду дело в клиенте??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 16:16:32 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
Вспомнил был и у меня подобный баг. Попробуйте в SP поставить: SET NOCOUNT ON ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 16:21:30 |
|
||
|
Что с курсором?
|
|||
|---|---|---|---|
|
#18+
4 Nickolay На DECLARE UpdateCursor CURSOR STATIC .... сервер ругается. А такое можно в 6.5? Я просто не знаю. Нет помоему. По всей видимости что-то происходит с записями в курсоре в то время пока они перебираются в цикле. Я имею ввиду расположение записей в курсоре. Но там ведь кластерный индекс, вроде его и должен использовать сервер при создании курсора, я его не обновляю, значит и порядок записей в созданном курсоре не должен меняться. Так или не так? И записи в цикле должны перебираться в соответствии с этим порядком. Или все совсем не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.10.2002, 16:28:39 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32055051&tid=1819886]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 318ms |

| 0 / 0 |
