
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
16.05.2003, 12:15
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Подскажите, плз, есть ли в Access такая вещь, как "начало транзакции" и "конец транзакции", т.е. чтоб если комп например вдруг вырубился делался откат и данные не пропадали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 12:23
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Workspace.BeginTrans Workspace.CommitTrans Workspace.Rollback Откат сам произойдет если комп вырубится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 13:18
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Workspace.BeginTrans - начало Workspace.CommitTrans - конец Workspace.Rollback - откат я правильно понимаю? и еще, это касается всех операций или только например запросов? у меня есть огромная функция, с кучей ветвлений, для работы с данными используется DAO. Могу ли я просто поставить в начале и в конце функции признаки начала и завершения транзакции? И если я разобью это функцию на несколько мелких, которые будут вызываться из одной главной, можно ли будет ставить признаки начала и завершения транзакции в этой ф-ции или это надо будет делать непосредственно в вызываемых ф-циях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 13:29
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Только когда будешь писать прогу пиши примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Все остальные подробности см. в хелпе. Транзакция - это основа всякой нормальной базы данных (и программы) . И в этом топике всего не пересказать. Замечу, что в некоторых случаях, применения транзакций может увеличить производительность. Но это уже другая тема... З.Ы. для ADO используется похожий синтаксис, но уже через Conection... З.Ы.Ы. Access почти всегда делает неявные транзакции сам... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 15:00
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Закрепляем пройденый материал :-))) Правильно ли будет так написать процедуру: Private Sub Import_Click() Dim ws As DAO.Workspace Dim dbMyDB As DAO.Database Dim rcdProd As DAO.Recordset Dim rcdRealiz As DAO.Recordset On Error GoTo err Set ws = DBEngine(0) Set dbMyDB = CurrentDb() Set rcdProd = dbMyDB.OpenRecordset("tblMowe") Set rcdRealiz = dbMyDB.OpenRecordset("tblNewRealiz") ws.BeginTrans Do Until rcdRealiz.EOF With rcdProd .AddNew ![Price ãðí] = rcdRealiz![Price otp] ![Price rozn] = rcdRealiz![Price] ![Skidka_Value] = rcdRealiz![Skidka] ![Prodavec] = rcdRealiz![Merch] ![DK_Num] = rcdRealiz![DK] + " " ![ID] = Me![ID] .Update End With rcdRealiz.MoveNext Loop rcdRealiz.Close DoCmd.SetWarnings False DoCmd.RunSQL "DELETE tblNewRealiz.* FROM tblNewRealiz;" DoCmd.SetWarnings True DoCmd.DeleteObject acTable, "tblNewRealiz" Me.Requery ws.CommitTrans ext: ws.Close Set ws = Nothing Set dbMyDB = Nothing Set rcdProd = Nothing Set rcdRealiz = Nothing Exit Sub err: ws.Rollback GoTo ext End Sub или я чегой-то недопонял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 15:14
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Почти правильно Только удалять записи из tblNewRealiz не нужно, ибо таблицу ты все равно убиваешь. И еще. Me.Requery и ws.CommitTrans надо бы местами поменять - пока транзакция не закрыта хрен у тебя формочка изменения увидит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 15:17
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
И ws.Close не нужен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 15:25
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Если рекордсет открывается до BeginTrans, то его лучше закрывать после Commit/Rollback. А если закрывается до, то открывать лучше после BeginTrans. И нехорошо DoCmd.SetWarnings False, потому что если оно именно в этот момент вылетит на Error, то так и останется SetWarnings False. Лучше вместо DoCmd.RunSQL использовать dbMyDB.Execute, тогда нет необходимости в DoCmd.SetWarnings False, и тогда заодно у меня будет больше уверенности, что эта команда будет включена в транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 15:36
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Используй не синтаксис Код: plaintext 1. 2. Если верить Гетцу DbEgine(0)(0) не одно и тоже Current() и еще одна ошибка - сперва надо закрывать подчиненые объекты, а затем главный объект Код: plaintext 1. 2. 3. 4. 5. Вторая ошибка Код: plaintext 1. 2. 3. Эта операция в транзакцию не попадет. Надо чтобы объект ws непосредственно участвовал в транзакции Например, dbMyDB .Execute "DELETE tblNewRealiz.* FROM tblNewRealiz;" . DoCmd.SetWarnings будет тогда лишним То что ты делаешь в цикле элементарно делается через SQL-инструкцию "UpDate...Set...", что будет гораздо быстрее. Ну пока вроде все ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 15:45
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
> То что ты делаешь в цикле элементарно делается через SQL-инструкцию "UpDate...Set...", что будет гораздо быстрее. дык, это ж я для примера взял кусок какого-то старого кода, первое что попалось... Всем большое спасибо, очень помогли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 15:53
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
2 Сенин Виктор Разумеется CurrentDB и DBEngine(0)(0) - не одно и то же. Тут даже без Гетца можно обойтись. Сам майкрософт где-то писал, что всякие коллекции (QueryDefs и TableDefs) в первом случае рефрешаться, а во втором - нет. А уж что тебе нужно - тебе решать, хотя в большинстве случаев абсолютно по барабану. А удалять строки из таблицы, которую саму следующей строкой удаляют - таки не нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 16:24
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
2 Лоху >Разумеется CurrentDB и DBEngine(0)(0) - не одно и то же В хелпе ни слова, в книгах (за исключением Гетца) ни слова; ссылка же будет на один и тот же объект - текущую базу данных, так откуда возьмется "разумеется"? >хотя в большинстве случаев абсолютно по барабану. Барабан был плох, барабанщик сдох... >И ws.Close не нужен Почему? Надежда на корректное уничтожение локальных переменных при входе из области видимости? З.Ы. Пора закругляться - короткий день - GoTo Домой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 16:39
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
2 Сенин Виктор Объект то один и тот же. Только в случае CurrentDB создается новый экземпляр (и все коллекции автоматом обновляются), а в случае DBEngine(0)(0) - возвращается ссылка на объект из коллекции Workspace.Databases (и все коллекции в нем какими были, такими и остануться) ws.Close не нужен потому, что все равно ws не закрывается пока на него ссылки есть. А на DBEngine(0) ссылка есть всегда. Та же фигня с ADO.Recordset. Прочитал это у Гетца и сильно призадумался - зачем же этом метод вообще нужен. Если после Set rs = Nothing ссылок больше нет - закрыться должен сам, а если ссылки есть - все равно не закроется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 16:51
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
2 Лоху Насчет ws.close - согласен Насчет Nothing - в принципе, не нужно закрывать Close - у меня это привычка Но если сделать Close, и не сделать Nothing - будут проблемы. Поэтому я как маньяк явно закрываю все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 16:58
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Насчет ws.Close - все еще хуже. Его нельзя вызывать (если было Set ws = DBEngine(0))!! Сам объект ws - не закроется, а вот все дочерние объекты (QueryDef, Recordset) - умрут. Насчет ADODB.Recordset я все-таки продолжаю удивляться. Как-то логично, что если говоришь Close - то рекордсет должен закрыться. А он на тебя положил оказывается... Причем только из-за того, что где-то ссылка висит. Уж лучше бы в этом где-то получилась ссылка на закрытый объект... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.05.2003, 17:32
|
|||
|---|---|---|---|
|
|||
Начало транзакции -> Конец транзакции? |
|||
|
#18+
Во блин, никому верить нельзя... Даже Гетцу... Только что проверил закрытие ADO-шных рекордсетов - все нормально. Они закрываются несмотря на ссылки. Теперь сомневаюсь в своей памяти. До дома доползу - Гетца на страницы порву, но этот глючный абзац отыщу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=45&mobile=1&tid=1681508]: |
0ms |
get settings: |
12ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 372ms |

| 0 / 0 |
