powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка по клиету VB6
15 сообщений из 15, страница 1 из 1
Задачка по клиету VB6
    #32030544
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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") возникает ошибка. Дословно: "(здесь номер ошибки....) Ошибка разрушения!". Во как прям страшно стало что ща комп разрушится. Причем если без транзакции то все работает

ЧЕ ЗА ХРЕНЬ ТАКАЯ???????? И КАК С НЕЙ БОРОТЬСЯ???????
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030561
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В приведенном фрагменте внутренний цикл не содержит rs.MoveNext - это опечатка?
Также вероятно, что объект ADODB.Connection используется как для открытия объекта
ADODB.RecordSet (строка rs.Open .....), так и для выполнения UPDATE'а в транзакции.
Вероятно, в этом причина ошибки. Если не трудно, приведите сообщение об ошибке на
английском языке (если возможно).

Удачи
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030565
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4 jimmers
> В приведенном фрагменте внутренний цикл не содержит rs.MoveNext - это опечатка?

Опечатки нет. Цикл выполняется нормально (незацикливается в смыле)

>объект ADODB.Connection используется как для открытия объекта
>ADODB.RecordSet (строка rs.Open .....), так и для выполнения UPDATE'а в транзакции.
>Вероятно, в этом причина ошибки.

поясни пожалста подробней откуда здесь появляется ошибка, без транзакций все работает

>приведите сообщение об ошибке на
>английском языке (если возможно).
VB русифицированный, ошибку привел дословно (за исключением номера) в предыдущем посте

>Удачи
да уж, чувствую без нее не обойтись
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030568
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Простите, но у меня все-таки остается неясность - ведь во внутреннем цикле
нет перемещения по объекту 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 и обновления записей в явной
транзакции.

Если не сложно, приведите, пожалуйста, номер ошибки.

Удачи
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030585
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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"). Транзакция необходима только для случая некорректного завершения программы (повис комп, выключили свет и т.д.). Да,и еще, засунуть все это хозяйство в хранимую процедуру не возможно, не спрашивайте почему, просто представьте, что это так.

>Если не сложно, приведите, пожалуйста, номер ошибки.

Сейчас не могу, завтра, код на работе.

Надеюсь на вашу помощь!
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030597
AlexanderVS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте отказаться от .execute, объявите еще один рекордсет и напишите для него:
RS_1.Open "UPDATE .... set ...=i.....", con
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030616
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала - пара цитаток из 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 , чего провайдер переварить не может...


По-любому: без номера ошибки - сложно догадаться "навскидку" что же именно происходит?
Ждем-с номер...
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030649
Kirk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Маленький совет: не пользуйтесь этими методами АДО (не скажу точно о корректности работы этих методов, но на практике получается не очень здорово; в частности, "вложенные" транзакции там не работают).
Маленький вопрос: почему бы для подобной отработки не написать процедуру? не говоря уж о том, что то, что у вас написано, можно сделать в один запрос (с небольшими ухищрениями).
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030694
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 раза больше приведенной. Она тоже проиводит подобные манипуляции. Ну скажите, как засунуть все это в процедуру?
Конечно можно разбить все на более мелкие процедуры, и вызывать их из клиента, но мне кажется, что в этом случае не произойдет особого прироста производительности.
Несомненно можно изменить алгоритм программы, но опять же, больших результатов это не даст потому, что я, например, не вижу очень простого решения задачи (очень даже не исключаю, что я ошибаюсь).
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030731
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что сказать?

Если вот это отрабатывает без ошибок:
\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, я честно говоря, не наблюдал, а лепить тестик, честно говоря, лень...

Хотя, по-прежнему, интересно было бы увидеть - код ошибки ?
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030772
Kirk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> rs.begintranaction:rs.begintranaction
rs.execute("update....")
rs.committransaction:rs.committransaction

Я не знаю, как щас (проверять не буду), но в ранних версиях АДО это просто НЕ работало.

2Smile:
Я не буду вдаваться в вашу задачу (ибо это ваша работа), но хинт я дал. Я почти уверен, что бОльшую часть этой функциональности можно (и должно) перенести на сторону сиквела. По крайней мере, кусок кода, который приведен в самом начале - такие вещи НУЖНО делать на стороне сервера.
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030814
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4 ALL

ОШИБКА:
_____________________
Run-time error '-2147418113(8000ffff)': Разрушительный сбой
__________________

Далее VB предлагает End, Ddebug или Help
Если хелп, то там написано. что-то вроде этого:
___________________________
Automation error (Error 440)
(далее перевожу)
Ошибка возникает при запуске метода или установке/получении значения свойства объектной переменной.
______________________

но вроде ни че не разрушается. по крайней мере комп пока жив
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030816
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Q187942
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030817
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Q187942
...
Рейтинг: 0 / 0
Задачка по клиету VB6
    #32030854
Smile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4 ALL
Всем большое спасибо, в той или иной степени ваши идеи, замечания и предложения мне помогли.

4 jimmers
Обалденно, я не думал, что все так просто.Если все работает, то это будет супер-пупер.

P.S. Все таки, думается мне, неплохо бы все это засунуть на сервер. Надо подумать.
Только помоему, стремно сервер БД заставлять файлы копировать.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Задачка по клиету VB6
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]