0 / 0 / 0
Регистрация: 18.11.2007
Сообщений: 39
|
|
1 | |
Вопрос по ADO и транзакциям.25.09.2008, 13:33. Показов 1542. Ответов 6
Метки нет (Все метки)
==============================================
db As New ADODB.Connection rec As New ADODB.Recordset db.Open 'DSN=Visual FoxPro Tables;UID=;PWD=;SourceDB=c:;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Col late=Machine;Null=Yeseleted=Yes;' Mdocm.Open 'table1', db, adOpenStatic, adLockPessimistic, adCmdTable 'начало транзакции db.BeginTrans for i=1 to 50 table1!field1 = '11111' table1.Update table1.MoveNext next i db.CommitTrans ===================================================== При каждом update проходит куча времени (база не маленькая), а должно обновлятся разом, при CommitTrans. Что-то делаю не так???
0
|
25.09.2008, 13:33 | |
Ответы с готовыми решениями:
6
Откат по транзакциям Вопрос по строке подключения ADO Вопрос по ADO command properties Общий вопрос по connection ADO |
0 / 0 / 0
Регистрация: 18.11.2007
Сообщений: 39
|
|
25.09.2008, 13:36 [ТС] | 2 |
Вернее, код выглядит вот так:
============================================== db As New ADODB.Connection rec As New ADODB.Recordset db.Open 'DSN=Visual FoxPro Tables;UID=;PWD=;SourceDB=c:;SourceType=DBF;Exclusive=No;BackgroundFetch=Yes;Col late=Machine;Null=Yeseleted=Yes;' rec.Open 'table1', db, adOpenStatic, adLockPessimistic, adCmdTable 'начало транзакции db.BeginTrans for i=1 to 50 rec!field1 = '11111' rec.Update rec.MoveNext next i db.CommitTrans =====================================================
0
|
0 / 0 / 0
Регистрация: 16.09.2008
Сообщений: 12
|
|
25.09.2008, 15:06 | 3 |
Попробуй метод Update выполнить после выполнения цикла
т.е. For i = 1 To 50 rec!Field1 = '11111' rec.MoveNext Next i rec.Update db.CommitTrans а то получается, что рекордсет обновляется при каждом шаге цикла, а ведь быстрее сначала изменить в цикле значение в самом поле, а уж потом обновлять сам рекордсет.
0
|
0 / 0 / 0
Регистрация: 18.11.2007
Сообщений: 39
|
|
25.09.2008, 15:22 [ТС] | 4 |
Дык смысл транзакции и заключается в том, что все операции с БД, производимые в теле транзакции реально ничего не меняют, а осуществляются одним выполнением CommitTrans.
И если я убираю Update, то такое же время теряется на MoveNext...
0
|
0 / 0 / 0
Регистрация: 16.09.2008
Сообщений: 12
|
|
25.09.2008, 15:35 | 5 |
В смысл транзкации вложен логический смысл, либо она выполняется, либо при наличии ошибок, откатывается. А скорость выполнения операторов от этого не зависит.
0
|
0 / 0 / 1
Регистрация: 05.09.2008
Сообщений: 97
|
|
25.09.2008, 16:56 | 6 |
Ни разу не пробовал применять транзакции(хотя мысль неплохая)...
короче если хотешь увеличить скорость то попробуй для внесения изменений использовать пакетный режим открытия рекордсета rec.Open 'table1', db, adOpenStatic, adLockBatchOptimistic, adCmdTable а для отправки изменений в базу соответственно : rec.UpdateBatch adAffectAll кстати метод .Update вызывается всякий раз когда происходит перемещение по рекордсету еще одна фишка для поднятия скорости отработки выполнения запроса ( псевдоускорение,так как скорость отработки запроса не зависит от приложения) используй асинхронный режим обработки запросов rec.Open strSQL , db, adOpenStatic, adLockOptimistic, adCmdText + adAsyncFetch ......может поможет )))
0
|
0 / 0 / 0
Регистрация: 18.11.2007
Сообщений: 39
|
|
28.09.2008, 08:52 [ТС] | 7 |
Действительно, при пакетном режиме открытия рекордсета все изменения вступают после UpdateBatch, но время выполнения этой операции как раз равно суммарному времени, если бы выполнять просто Update внутри цикла. Так что, то на то и выходит.
Асинхронный режим у меня не поддерживает ODBC провайдер (VFP). И ещё вопрос - может кто знает: почему, когда отврываешь таблицу в DAO: Set db = OpenDatabase(Path, 0, 0, 'Foxpro 2.6') Set rec= db2.OpenRecordset('Table1', dbOpenTable) Таблица открывается практически мгновенно, а в ADO она вся считывается. И внесение изменений в DAO происходит мгновенно: rec.Edit rec!Field1 = '111111' rec.Update а в ADO - опять же полностью сначала считывается??? Где же преимущества ADO? Или все зашибись только с MDB? P.S.: Я бы с удовольствием писал на DAO, но при внесении изменений вышеуказанным образом, индексные файлы не обновляются, а при использовании драйвера VFP - всё Ok, но проблемы со временем. Индексы CDX типа (Field1+Field2+' 99').Короче это базы БЭСТА.
0
|
28.09.2008, 08:52 | |
28.09.2008, 08:52 | |
Помогаю со студенческими работами здесь
7
Вопрос по ADO и соответствие двух combobox Вопрос по MS ADO и SQL Server 2000 Вопрос по Application role и ADO Data Control ADO+MS SQL: как узнать количество обработанных строк при insert в ADO Query? Вопрос по SetParent (поэтому, наверное, это вопрос к NickStaves) ADO.NET Connection->ADO Connection Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |