Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как проверить выполнение SQL инструкции перед записью результатов? / 18 сообщений из 18, страница 1 из 1
13.09.2019, 11:25
    #39861394
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
Уважаемый форум,

Есть Office 365, Access. Есть блок инструкций, которые необходимо выполнить в комплексе, т.е. при сбое одной из них, нужно откатить все предыдущие. Как-то не складывается использовать begin, commit, rolback. Пример:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
On Error Goto err

db.BeginTrans
db.Execute("DELETE FROM Table"), dbSeeChanges, dbFailOnError
db.Execute("INSERT INTO Table SELECT * FROM Table2"), dbSeeChanges, dbFailOnError
db.CommitTrans

err:
db.RollbackTrans



Т.е. в примере происходит выполнение инструкции DELETE, затем ошибка при выполнении INSERT, но DELETE не открывается - записи удаляются.

Что не так или чего я недопонимаю? Спасибо!
...
Рейтинг: 0 / 0
13.09.2019, 14:21
    #39861551
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
IFK,

Я бы не полагался на авто откаты, делал бы точную копию (как буфер) Table, над ней бы экспериментировал и уже из неё (из копии) заливал конечный результат в Table... Да и всё в целом как-то не логично - если изначально содержимое Table не нужно (ибо удаляется всё под ноль), то зачем его восстанавливать потом?
...
Рейтинг: 0 / 0
13.09.2019, 14:45
    #39861577
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
Вы бы показали, что есть объект db , что ли... ADODB.Connection? тогда где adExecuteNoRecords? или оно - что-то ещё?
...
Рейтинг: 0 / 0
13.09.2019, 15:10
    #39861601
Как проверить выполнение SQL инструкции перед записью результатов?
IFKКак-то не складывается использовать begin, commit, rolback. Пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
On Error Goto err

db.BeginTrans
db.Execute("DELETE FROM Table"), dbSeeChanges, dbFailOnError
db.Execute("INSERT INTO Table SELECT * FROM Table2"), dbSeeChanges, dbFailOnError
db.CommitTrans

err:
db.RollbackTrans



Т.е. в примере происходит выполнение инструкции DELETE, затем ошибка при выполнении INSERT, но DELETE не открывается - записи удаляются. 1. У объекта Database нет метода BeginTrans и т.п. Это методы Workspace.
2. В DAO у метода Execute два аргумента (запрос , параметры), а у вас dbFailOnError идет 3-м.

Странно, что у вас это вообще работает.

ЗЫ. dbSeeChanges с методом Execute никогда не использовал, достаточно dbFailOnError.
...
Рейтинг: 0 / 0
13.09.2019, 17:13
    #39861705
sdku
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
Если внимательно и вдумчиво почитать про транзакции,то Ваша задача довольно просто решается
...
Рейтинг: 0 / 0
13.09.2019, 19:37
    #39861781
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
IFKЧто не так или чего я недопонимаю?смотри в FAQ/MS Access/Как запускать запросы из VBA раздел 2.6
...
Рейтинг: 0 / 0
13.09.2019, 19:39
    #39861782
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
IFK, и скобки д..е убери
...
Рейтинг: 0 / 0
18.09.2019, 10:54
    #39863189
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
AkinaВы бы показали, что есть объект db , что ли... ADODB.Connection? тогда где adExecuteNoRecords? или оно - что-то ещё?

Да, ADODB.Connection
...
Рейтинг: 0 / 0
18.09.2019, 10:56
    #39863191
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
vmagIFK,

Я бы не полагался на авто откаты, делал бы точную копию (как буфер) Table, над ней бы экспериментировал и уже из неё (из копии) заливал конечный результат в Table... Да и всё в целом как-то не логично - если изначально содержимое Table не нужно (ибо удаляется всё под ноль), то зачем его восстанавливать потом?

Оно не восстанавливается, а перезаписывается с измененными данными. Не хочу возиться с индивидуальными полями для каждой записи - их дохрена и проверять изменилось ли содержимое каждого поля, чтобы потом его проапдейтить - слишком долго и муторно. Проще прибить старую запись и внести ее же, только с актуальными данными.
...
Рейтинг: 0 / 0
18.09.2019, 10:57
    #39863192
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
Кривцов АнатолийIFKКак-то не складывается использовать begin, commit, rolback. Пример:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
On Error Goto err

db.BeginTrans
db.Execute("DELETE FROM Table"), dbSeeChanges, dbFailOnError
db.Execute("INSERT INTO Table SELECT * FROM Table2"), dbSeeChanges, dbFailOnError
db.CommitTrans

err:
db.RollbackTrans



Т.е. в примере происходит выполнение инструкции DELETE, затем ошибка при выполнении INSERT, но DELETE не открывается - записи удаляются. 1. У объекта Database нет метода BeginTrans и т.п. Это методы Workspace.
2. В DAO у метода Execute два аргумента (запрос , параметры), а у вас dbFailOnError идет 3-м.

Странно, что у вас это вообще работает.

ЗЫ. dbSeeChanges с методом Execute никогда не использовал, достаточно dbFailOnError.

А у меня не DAO, а ADODB. Там есть, судя по интеллисенсу.
...
Рейтинг: 0 / 0
18.09.2019, 10:58
    #39863194
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
ПанургIFK, и скобки д..е убери

Какие скобки убрать? Там все скобки на месте.
...
Рейтинг: 0 / 0
18.09.2019, 11:00
    #39863197
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
sdkuЕсли внимательно и вдумчиво почитать про транзакции,то Ваша задача довольно просто решается\\

Не поверите, читал и неоднократно, сделал именно так, как написано, но не работает. Выбрасывает по ошибке, но ничего не откатывает.
...
Рейтинг: 0 / 0
18.09.2019, 11:10
    #39863205
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
ПанургIFKЧто не так или чего я недопонимаю?смотри в FAQ/MS Access/Как запускать запросы из VBA раздел 2.6

Ага, смотрел и даже делал именно так, как там описано - нифига не откатывается, т.е. записи удаляются, вываливается ошибка при выполнении следующей операции, уходит на обработку ошибок, но удаление в обработке ошибок не откатывается.
...
Рейтинг: 0 / 0
18.09.2019, 11:13
    #39863211
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
IFKДа, ADODB.Connectionну и нахрена мешать всё в кучу? Объекты ADODB, константы DAO. Наименования объектов тоже от DAO.
Трудно сходить по ссылке - 21970695 и там аккуратно переписать?
Или уж если хочется для ADO
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim cnn as ADODB.Connection
Dim blnFlag as Boolean

On Error Goto err
Set cnn =CurrentProject.Connection
cnn .BeginTrans
blnFlag =true
cnn .Execute "DELETE FROM Table"
cnn .Execute "INSERT INTO Table SELECT * FROM Table2"
cnn .CommitTrans
blnFlag =false
Set cnn =Nothing
err:
    if blnFlag then cnn .RollbackTrans
...
Рейтинг: 0 / 0
18.09.2019, 11:14
    #39863212
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
IFKКакие скобки убрать? Там все скобки на месте.От слова "ВСЕ"
...
Рейтинг: 0 / 0
18.09.2019, 11:19
    #39863215
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
ПанургIFKКакие скобки убрать? Там все скобки на месте.От слова "ВСЕ"

А какая разница, со скобками или без? Работает и так и так. Или я чего-то не знаю?
...
Рейтинг: 0 / 0
18.09.2019, 11:26
    #39863220
Панург
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
IFKА какая разница, со скобками или без? Работает и так и так. Или я чего-то не знаю?
...
Рейтинг: 0 / 0
18.09.2019, 11:27
    #39863221
IFK
IFK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как проверить выполнение SQL инструкции перед записью результатов?
ПанургIFKДа, ADODB.Connectionну и нахрена мешать всё в кучу? Объекты ADODB, константы DAO. Наименования объектов тоже от DAO.
Трудно сходить по ссылке - 21970695 и там аккуратно переписать?
Или уж если хочется для ADO
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Dim cnn as ADODB.Connection
Dim blnFlag as Boolean

On Error Goto err
Set cnn =CurrentProject.Connection
cnn .BeginTrans
blnFlag =true
cnn .Execute "DELETE FROM Table"
cnn .Execute "INSERT INTO Table SELECT * FROM Table2"
cnn .CommitTrans
blnFlag =false
Set cnn =Nothing
err:
    if blnFlag then cnn .RollbackTrans

Вопрос вдогонку: если одна из команд не выполнится из-за таймаута соединения с сервером, откатится ли вся трансакция по ошибке или нет?
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как проверить выполнение SQL инструкции перед записью результатов? / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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