|
|
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
dim con as adodb.connection, rs as new adodb.recordset, i as long ..... .....'здесь коннектимся к серверу ..... ..... rs.Open ..... while ..... While Not rs.EOF con.BeginTrans ...... ...... i=rs.Fields("Kod") ...... con.execute("UPDATE .... set ...=i.....") con.CommitTrans Wend rs.MoveNext wend set rs=nothing 1)con инициализируется корректно 2)rs открывается корректно и содержит записи 3)во внешнем и вложенном циклах ни какого обращения к rs не происходит, кроме указанных, ни какие соеднинения и объекты не создаются 4)транзакции кроме указанной не используются 5)UPDATE .... set ...=i..... в query tools выполняеися корректно вложенный цикл выполняется один раз, потом второй, и во время второго раза где i=rs.Fields("Kod") возникает ошибка. Дословно: "(здесь номер ошибки....) Ошибка разрушения!". Во как прям страшно стало что ща комп разрушится. Причем если без транзакции то все работает ЧЕ ЗА ХРЕНЬ ТАКАЯ???????? И КАК С НЕЙ БОРОТЬСЯ??????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2002, 16:30 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
В приведенном фрагменте внутренний цикл не содержит rs.MoveNext - это опечатка? Также вероятно, что объект ADODB.Connection используется как для открытия объекта ADODB.RecordSet (строка rs.Open .....), так и для выполнения UPDATE'а в транзакции. Вероятно, в этом причина ошибки. Если не трудно, приведите сообщение об ошибке на английском языке (если возможно). Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2002, 19:44 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
4 jimmers > В приведенном фрагменте внутренний цикл не содержит rs.MoveNext - это опечатка? Опечатки нет. Цикл выполняется нормально (незацикливается в смыле) >объект ADODB.Connection используется как для открытия объекта >ADODB.RecordSet (строка rs.Open .....), так и для выполнения UPDATE'а в транзакции. >Вероятно, в этом причина ошибки. поясни пожалста подробней откуда здесь появляется ошибка, без транзакций все работает >приведите сообщение об ошибке на >английском языке (если возможно). VB русифицированный, ошибку привел дословно (за исключением номера) в предыдущем посте >Удачи да уж, чувствую без нее не обойтись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2002, 23:23 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
Простите, но у меня все-таки остается неясность - ведь во внутреннем цикле нет перемещения по объекту ADODB.RecordSet (либо Вы не весь код, относящийся к ADO, привели) While ..... While Not rs.EOF con.BeginTrans() ...... ...... i = rs.Fields("Kod") ...... con.Execute("UPDATE .... set ...=i.....") con.CommitTrans() Wend rs.MoveNext() Wend rs = Nothing Ошибка может возникать из-за того, что Вы разделяете один и тот же объект ADODB.Connection для работы с ADODB.RecordSet и обновления записей в явной транзакции. Если не сложно, приведите, пожалуйста, номер ошибки. Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2002, 06:04 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
4 jimmers >Простите, но у меня все-таки остается неясность - ведь во внутреннем цикле >нет перемещения по объекту ADODB.RecordSet Пусть вас это не смущает, вход из внутреннего цикла происходит не по условию rs.EOF=True, а совсем по другому условию. Внутренний цикл ни как не связан с перемещением по рекордсету, просто в нем используется текущее значение рекордсета. >(либо Вы не весь код, относящийся к ADO, привели) Конечно не весь, на основе соединения con открываются еще пару рекордсетов, кроме того, во внутреннем цикле используются кроме con.Execute("UPDATE .... set ...=i.....") еще несколько con.Execute("UPDATE..."), con.Execute("INSERT..."), con.Execute("DELETE..."), все они стоят после i = rs.Fields("Kod"), до i = rs.Fields("Kod") выполняются различные действия не связанные с ADO (просто некоторые вычисления). >Ошибка может возникать из-за того, что Вы разделяете один и тот же объект >ADODB.Connection для работы с ADODB.RecordSet и обновления записей в явной >транзакции По всей видимости, я ошибаюсь, поправьте меня, если я думаю неправильно. Прочитав ваш пост у меня возник вопрос: если я использую разные соединения, то каким образом транзакцию открытую в одном соединении, можно отменить или подтвердить в совсем другом соединении? Поэтому я использую одно соединение. Ведь все изменения БД во вложенном цикле должны происходить в рамках одной транзакции (по логике приложения), либо все либо никакие. Поэтому я использую одно соединение. Или же мне нужно использовать rs.add, rs.edit, rs.delete вместо con.execute? Хочется еще раз обратить ваше внимание, что без транзакции все работает правильно, а с транзакцией только при первом прохождении вложенного цикла. При втором спотыкается о i = rs.Fields("Kod"). Транзакция необходима только для случая некорректного завершения программы (повис комп, выключили свет и т.д.). Да,и еще, засунуть все это хозяйство в хранимую процедуру не возможно, не спрашивайте почему, просто представьте, что это так. >Если не сложно, приведите, пожалуйста, номер ошибки. Сейчас не могу, завтра, код на работе. Надеюсь на вашу помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2002, 15:57 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
Попробуйте отказаться от .execute, объявите еще один рекордсет и напишите для него: RS_1.Open "UPDATE .... set ...=i.....", con ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2002, 00:59 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
Для начала - пара цитаток из MSDN по MDAC 2.5: \nNote Not all providers support transactions. Verify that the provider-defined property "Transaction DDL" appears in the Connection object's Properties collection, indicating that the provider supports transactions. If the provider does not support transactions, calling one of these methods will return an error... \nFor providers that support nested transactions, calling the BeginTrans method within an open transaction starts a new, nested transaction... Убедитесь, что вы используете провайдер, поддерживающий транзакции, и не просто транзакции, а еще и "вложенные"... >> выход из внутреннего цикла происходит не по условию rs.EOF=True, а совсем по другому условию Из-за того, что выход из внутреннего цикла происходит по некоему "другому условию", местоположение которого (выхода) вы в коде не указали, может легко случиться так, что после выполнения con.BeginTrans - происходит выход из внутреннего цикла, а затем - новый вход с новым con.BeginTrans , чего провайдер переварить не может... По-любому: без номера ошибки - сложно догадаться "навскидку" что же именно происходит? Ждем-с номер... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2002, 08:04 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
Маленький совет: не пользуйтесь этими методами АДО (не скажу точно о корректности работы этих методов, но на практике получается не очень здорово; в частности, "вложенные" транзакции там не работают). Маленький вопрос: почему бы для подобной отработки не написать процедуру? не говоря уж о том, что то, что у вас написано, можно сделать в один запрос (с небольшими ухищрениями). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2002, 13:00 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
4 AlexanderVS Спасибо за совет, как попробую, так сразу поделюсь результатами. 4 qu-qu >Note Not all providers support transactions. The used provider supports transactions, including, nested transactions. Проверил: rs.begintranaction rs.begintranaction rs.execute("update....") rs.committransaction rs.committransaction работает без ошибок >Из-за того, что выход из внутреннего цикла происходит по некоему "другому условию", >местоположение которого (выхода) вы в коде не указали, может легко случиться так, >что после выполнения con.BeginTrans - происходит выход из внутреннего цикла, >а затем - новый вход с новым con.BeginTrans, чего провайдер переварить не может... Привожу кусок многострадального кода (прошу не прикалываться, если некоторые приемы программирования покажутся смешными, лучше дайте совет): rsПути.Open "SELECT * FROM NeUdalenniePutiKopirovshika ORDER BY Kod", Соединение, adOpenStatic, adLockReadOnly, adCmdText If rsПути.RecordCount <> 0 Then While Not rsПути.EOF Откуда = rsПути.Fields("Otkuda") & iif(IsNull(rsПути.Fields("DataOtkuda")), "",rsПути.Fields("DataOtkuda") & "\") Куда = rsПути.Fields("Kuda") & iif(IsNull(rsПути.Fields("DataKuda")), "",rsПути.Fields("DataKuda") & "\") rsМаскиВключения.Open "SELECT * FROM MaskiVklucheniaDlaKopirovshika WHERE KodPutei=" & rsПути.Fields("Kod"), Соединение, adOpenStatic, adLockReadOnly fМаскокВключенияНет = IIf(rsМаскиВключения.RecordCount = 0, True, False) rsМаскиИсключения.Open "SELECT * FROM MaskiIsklucheniaDlaKopirovshik WHERE KodPutei=" & rsПути.Fields("Kod"), Соединение, adOpenStatic, adLockReadOnly Файл = Dir(Откуда & "*.*") If Файл = "" Then If Dir(Откуда, vbDirectory) = "" Then ЗаписатьВЛоги "BadLogs", rsПути.Fields("Kod"), "Bad path Otkuda" End If While Файл <> "" f = False If fМаскокВключенияНет Then f = True Else rsМаскиВключения.MoveFirst Do While Not rsМаскиВключения.EOF If ПодходитПоМаске(Файл, rsМаскиВключения.Fields("Mask")) Then f = True Exit Do End If rsМаскиВключения.MoveNext Loop End If If f = True Then f = False If rsМаскиИсключения.RecordCount <> 0 Then rsМаскиИсключения.MoveFirst Do While Not rsМаскиИсключения.EOF If ПодходитПоМаске(Файл, rsМаскиИсключения.Fields("Mask")) Then f = True Exit Do End If rsМаскиИсключения.MoveNext Loop End If If f = False Then i = rsПути.Fields("Kod") Соединение.BeginTrans ЗаписатьВЛоги "Logs", i, Файл If rsПути.Fields("Operacia") = "c" Then If КопированиеФайла(Откуда, Куда, Файл) = False Then УдалитьИзЛоговПоследнююЗапись ЗаписатьВЛоги "BadLogs", i, Файл End If Else If ПереносФайла(Откуда, Куда, Файл) = False Then УдалитьИзЛоговПоследнююЗапись ЗаписатьВЛоги "BadLogs", i, Файл End If End If Соединение.CommitTrans End If End If Файл = Dir Wend Set rsМаскиВключения = Nothing Set rsМаскиИсключения = Nothing rsПути.MoveNext Wend End If В процедурах УдалитьИзЛоговПоследнююЗапись, ЗаписатьВЛоги и функциях КопированиеФайла,ПереносФайла транзакции не используются, только одиночные rs.Execute("INSERT..."), rs.Execute("DELETE...") Честно говоря, ошибок типа >может легко случиться так< я здесь не вижу, но часто так бывает, что невидишь самое очевидное. Если не трудно разобраться во сем этом, буду рад если найдете ошибку. 4 Kirk >почему бы для подобной отработки не написать процедуру? не говоря уж о том, что то, что у вас написано, можно сделать в один запрос (с небольшими ухищрениями). Приведенная выше часть - кусок процедуры Копировщик, а есть еще процедура РазборщикПочты, которая в 2 раза больше приведенной. Она тоже проиводит подобные манипуляции. Ну скажите, как засунуть все это в процедуру? Конечно можно разбить все на более мелкие процедуры, и вызывать их из клиента, но мне кажется, что в этом случае не произойдет особого прироста производительности. Несомненно можно изменить алгоритм программы, но опять же, больших результатов это не даст потому, что я, например, не вижу очень простого решения задачи (очень даже не исключаю, что я ошибаюсь). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2002, 19:54 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
Ну что сказать? Если вот это отрабатывает без ошибок: \nrs.begintranaction rs.begintranaction rs.execute("update....") rs.committransaction rs.committransaction И вот здесь: \nСоединение.BeginTrans ЗаписатьВЛоги "Logs", i, Файл If rsПути.Fields("Operacia") = "c" Then If КопированиеФайла(Откуда, Куда, Файл) = False Then УдалитьИзЛоговПоследнююЗапись ЗаписатьВЛоги "BadLogs", i, Файл End If Else If ПереносФайла(Откуда, Куда, Файл) = False Then УдалитьИзЛоговПоследнююЗапись ЗаписатьВЛоги "BadLogs", i, Файл End If End If Соединение.CommitTrans Между BeginTrans и CommitTrans - нет выходов из цикла и/или любых других "завернутых" ветвлений кода, то остается искать причину - на серверной стороне... Судя по синтаксису вызовов ЗаписатьВЛоги "Logs", i, Файл и ЗаписатьВЛоги "BadLogs", i, Файл - эта функция ( ЗаписатьВЛоги ) вставляет что-то в таблицы Logs и BadLogs соответственно... А нет ли на этих таблицах каких-нить "хитрых" триггеров на INSERT/UPDATE/DELETE, в которых может возникать откат транзакции из триггера? Если есть - тады ку-ку... Откат из триггера - штука жестокая, т.к. он - откатывает все транзакции вплоть до самого верхнего уровня вложенности (т.е. до уровня процедуры, или батча) и не дает процедуре, или батчу - выполняться с той строки, которая вызвала откат из триггера... Как реагирует на такие штучки ADO, я честно говоря, не наблюдал, а лепить тестик, честно говоря, лень... Хотя, по-прежнему, интересно было бы увидеть - код ошибки ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2002, 06:31 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
> rs.begintranaction:rs.begintranaction rs.execute("update....") rs.committransaction:rs.committransaction Я не знаю, как щас (проверять не буду), но в ранних версиях АДО это просто НЕ работало. 2Smile: Я не буду вдаваться в вашу задачу (ибо это ваша работа), но хинт я дал. Я почти уверен, что бОльшую часть этой функциональности можно (и должно) перенести на сторону сиквела. По крайней мере, кусок кода, который приведен в самом начале - такие вещи НУЖНО делать на стороне сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2002, 08:27 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
4 ALL ОШИБКА: _____________________ Run-time error '-2147418113(8000ffff)': Разрушительный сбой __________________ Далее VB предлагает End, Ddebug или Help Если хелп, то там написано. что-то вроде этого: ___________________________ Automation error (Error 440) (далее перевожу) Ошибка возникает при запуске метода или установке/получении значения свойства объектной переменной. ______________________ но вроде ни че не разрушается. по крайней мере комп пока жив ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2002, 12:09 |
|
||
|
Задачка по клиету VB6
|
|||
|---|---|---|---|
|
#18+
4 ALL Всем большое спасибо, в той или иной степени ваши идеи, замечания и предложения мне помогли. 4 jimmers Обалденно, я не думал, что все так просто.Если все работает, то это будет супер-пупер. P.S. Все таки, думается мне, неплохо бы все это засунуть на сервер. Надо подумать. Только помоему, стремно сервер БД заставлять файлы копировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2002, 20:31 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32030817&tid=1822656]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
179ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
1ms |
| others: | 202ms |
| total: | 465ms |

| 0 / 0 |
