АндрейБ писал(а):ни как не могу понять, как и куда писать.
Код в студию! А так, без кода могу предположить, что выбраны неправильные параметры рекордсета.АндрейБ писал(а):На счет блокировок не подскажите, в DAO для редактировния записи просто пишем RST.EDIT ... RST.UPDATEв ADO .EDIT нет, хочу изменить значение и перехожу на следующую запись MoveNext - ругается что что рекордсет не поддерживает обновления, как изменить блокировки в рекордсет, что бы можно было редактировать?
Dim DBS As ADODB.Connection
Dim RST As ADODB.Recordset
Set DBS = New ADODB.Connection
DBS.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" +C:\A.mdb") + ";Jet OLEDB:Database Password=AA;"
Set RST = New ADODB.Recordset
With RST
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.CursorLocation = adUseClient
.Open "Select * From AAA;", DBS
End With
RST.MoveFirst
RST![AAAA] = Now()
RST.MoveNext
Ну так я же про это написал еще в самом первом постеАндрейБ писал(а):Решил проблему скорости обновления, зашел в акцесс / сервис / параметры / другие / блокирока по умолчанию = изменяемой записи - и все заработалокак я и хотел.
И видимо это осталось без внимания.ger_kar писал(а):На основе тех данных, что тут приведены (и отсутствию других) смею предположить, что проблема кроется в блокировках, которыми блокируется видимо вся таблица. Нужно как минимум блокировать только записи, которые будут меняться.
Если сравнивать скорость DAO И ADO при работе с *.mdb, то скорость выше у DAO. В нете можно даже найти сравнительную таблицу (видел давно и уже не помню где точно). Смысл использования ADO состоит не в скорости работы, ибо в многопользовательском варианте это уже не так важно, а смысл в том, что-бы использовать отключаемые рекордсеты и не блокировать лишнее время таблицы или записи. Только с ADO возможен вариант: Подключение, чтение данных, отключение, правка пользователем данных без блокировок (а это как правило самая длительная часть), опять подключение и пакетное изменение данных в базе с разгуливанием конфликтов. И тогда при многопользовательском режиме скорость будет больше чем у DAO. Только ADO даст тебе возможность в период правки отключенного рекордсета отключать и само соединение к базе (в том числе и вообще можно вытащить сетевой кабель), а перед обновлением данных проверять корректность соединения, и делать обновление базы если оно существует, или предупреждать юзера об его отсутствии. Т.е. такой сценарий: Открыл данные начал правку, выдернулся (может даже случайно) сетевой кабель. Нажал сохранить - получил сообщение о недоступности базы, проверил и восстановил соединение и сохранил без всяких эксцессов свои данные. Ну и многое другое, чего нельзя сделать в DAO.АндрейБ писал(а):Теперь не знаю - был ли смысл переходит с DAO на ADO?
А соединение с базой устанавливается каждый раз при обновлении или соединение устанавливается один раз, а потом используется готовое?АндрейБ писал(а):В акцессе просматривая запись обновления идет четко каждую секунду, а вот в коде VB есть не большая задержка 1-2 секунды.
Там ковыряться смысла нет ибо эти параметры влияют только на работу из среды Access.АндрейБ писал(а):В акцесс / сервис / параметры / другие - есть:время ожиданий OLE/DDE, период обновления и т.д. - там есть смыл поковыряться?
И никак не могу понять смысла этого действа. Зачем нужно так часто менять одну и ту-же запись?АндрейБ писал(а):Одна программа через Timer интервал 1 секунда корректирует запись внося текущее системное время в базу данных JET в таблицу с одним полем (и в таблица соответственно всего одна запись).
Ну так оно и есть. Если имеется таблица, а в ней есть одна единственная запись, то по сутиАндрейБ писал(а):Но вторая программа получает обновления от JET примерно раз в пять секунд (как будто старая ситуация сохранилась с блокировкой).Все делаю через ADO.
А причем тут Access? Или для одной базы (одного файла mdb) будут работать разные клиенты? Клиент на VB6 и сам Access?АндрейБ писал(а):Изначально в акцессе обновление шло примерно 1 раз в пять секунд, но после того как при открытие базы данных я прописал "блокировка на изменяемую запись".Properties("Jet OLEDB:Database Locking Mode") = 1
в акцессе запись стала меняться каждую секунду.
В каком месте это прописано? С какими параметрами открывается соединение Access и соединение ADO? Какой режим доступа выбран?АндрейБ писал(а):при открытие базы данных я прописал "блокировка на изменяемую запись"
Зависит от того, что требуется получить. Если просто прочитать данные, то лучше использовать одно, если их менять то другое и т.д.АндрейБ писал(а):и при открытие набора записей я прописал тип курсор, тип блокировки и положение курсора (здесь я экспериментировал по разному):.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.CursorLocation = adUseClient
Соображения такие. Проблема возникла от непонимания сути. И какой бы не была задача, очевидно, что проблема в том, что изначально выбран неверный подход для её решения. И помочь тут вряд ли кто в состоянии, ибо суть решаемой задачи никому не известна. Поэтому самое лучшее, что возможно сделать в данной ситуации - это описать суть проблемы (задачи) абстрагируясь от деталей и способов её реализации. Т.е. четко сформулировать задачу, что дано и что необходимо получить. Но делать это следует так, что-бы формулировка была понятна другим. И вот тогда я думаю коллективный разум (если поймет суть поставленной задачи) наверняка предложит оптимальное решение.АндрейБ писал(а):Есть у кого соображения по данному вопросу?
ПРОЕКТ 1:
Option Explicit
'БАЗЫ ДАННЫХ 'ADO
Dim DBS1 As ADODB.Connection
'ТАБЛИЦЫ 'ADO
Dim RST1 As ADODB.Recordset
Private Sub Form_Load()
'Описание баз данных и таблиц 'ADO
Set DBS1 = New ADODB.Connection
With DBS1
.Provider = "Microsoft.JET.OLEDB.4.0"
.Properties("Data Source") ="C:\DB\A.mdb")
.Properties("Jet OLEDB:Database Locking Mode") = 1
.Properties("Jet OLEDB:Database Password") = "A"
.Open
End With
Set RST1 = New ADODB.Recordset 'Таблица дата/время
With RST1
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.CursorLocation = adUseClient
.Open "AA", DBS1
End With
End Sub
Private Sub Timer1_Timer()
'Обновляем значение поля в таблице каждую секунду
RST1![dt] = Now()
RST1.Update
End Sub
ПРОЕКТ 2:
Option Explicit
'БАЗЫ ДАННЫХ 'ADO
Dim DBS1 As ADODB.Connection
'ТАБЛИЦЫ 'ADO
Dim RST1 As ADODB.Recordset
Private Sub Form_Load()
'Описание баз данных и таблиц 'ADO
Set DBS1 = New ADODB.Connection 'SERVER
With DBS1
.Provider = "Microsoft.JET.OLEDB.4.0"
.Properties("Data Source") ="C:\DB\A.mdb")
.Properties("Jet OLEDB:Database Locking Mode") = 1
.Properties("Jet OLEDB:Database Password") = "A"
.Open
End With
Set RST1 = New ADODB.Recordset 'Таблица дата/время
With RST1
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.CursorLocation = adUseClient
.Open "AA", DBS1
End With
End Sub
Private Sub Timer1_Timer()
'Обновляем значение TextBox в форме каждую секунду, беря значения из таблице
RST1.Requery
TextBox1.Text = RST1![dt]
End Sub
Private Sub Timer1_Timer()
'Описание баз данных и таблиц 'ADO
Set DBS1 = New ADODB.Connection
With DBS1
.Provider = "Microsoft.JET.OLEDB.4.0"
.Properties("Data Source") ="C:\DB\A.mdb")
.Properties("Jet OLEDB:Database Locking Mode") = 1
.Properties("Jet OLEDB:Database Password") = "A"
.Open
End With
Set RST1 = New ADODB.Recordset 'Таблица дата/время
With RST1
.CursorType = adOpenDynamic
.LockType = adLockOptimistic
.CursorLocation = adUseClient
.Open "AA", DBS1
End With
'Обновляем значение TextBox в форме каждую секунду, беря значения из таблице
RST1.Requery
TextBox1.Text = RST1![dt]
RST1.Close 'Закрываем набор записей
DBS1.Close 'Закрываем соединения с базой
End Sub
Хакер писал(а):АндрейБ, хочешь получить предупреждение?
АндрейБ писал(а):Я пишу конкретную ситуацию, с примером кода, проблема в моем понимании есть, решить ее я не могу на своем уровне понимания процессов.
Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 9