Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 18.11.2007
Сообщений: 39
1

Вопрос по ADO и транзакциям.

25.09.2008, 13:33. Показов 1542. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
==============================================
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2008, 13:33
Ответы с готовыми решениями:

Откат по транзакциям
Добрый вечер! Исп. SQL SERVER2008. При изменении БД все транзакции помечаю. А как мне теперь...

Вопрос по строке подключения ADO
Здравствуйте. Никак не могу найти ответ на такой вопрос. Я хочу подключить приложение написаное на...

Вопрос по ADO command properties
Треба в базе Interbase создавать хранимые процедуры. Синтаксис вроде такой: Dim cmd As New...

Общий вопрос по connection ADO
Уважаемые коллеги, приветствую! Есть аксесс и есть MySQL server. Подключение с сервером...

6
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2008, 08:52
Помогаю со студенческими работами здесь

Вопрос по ADO и соответствие двух combobox
Таблица в Access, 3 поля : fam,ima,otch. На форме 1 dbgrid, 3 combobox. Поместил на форму...

Вопрос по MS ADO и SQL Server 2000
На клиенте есть адошный рекордсет - клон какого-то рекордсета, зачитанного ранее из HTML-файла...

Вопрос по Application role и ADO Data Control
Есть у меня приложение, обращающееся к msde. Пользователи входят под своими аккаунтами, работают,...

ADO+MS SQL: как узнать количество обработанных строк при insert в ADO Query?
Добрый день. При выполнении запроса в MS SQL insert into ..(,,) select 0,20,'Text' where...

Вопрос по SetParent (поэтому, наверное, это вопрос к NickStaves)
Есть набор форм, назовём их 'интерфейсными'. Есть отдельная форма, назовём её 'хранилищем'. Сама...

ADO.NET Connection->ADO Connection
Может, кто-нибудь знает, как ссылку на объект Connection из ADO.NET преобразовать в ссылку на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru