powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
25 сообщений из 30, страница 1 из 2
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32449013
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32449019
Nikita_MV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
http://idoc.nm.ru/ADO_CURSOR/Property_Conduct_Recordset.htm

А так, то веть работа идет только с КУРСОРОМ, в базу то запись идет только по команде... MyRecordset.Update
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32449534
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    Dim rst As New ADODB.Recordset
    Dim sql As String

    sql =  "SELECT * FROM Products Where Id_Product = 1 "
    
    rst.Open sql, cnnAccess, adOpenDynamic, adLockOptimistic
    
    With rst
        .AddNew
            !Id_Customer = Id_Customer
        .Update
    End With
    
    rst.Close
    Set rst = Nothing


После .Update таблица становится недоступна для изменений другим пользоателем, даже после rst.close и Set rst = Nothing
Только когда из программый выйдешь то все ок.

Конекшн используется такой:
cnnAccess.CursorLocation = adUseClient
cnnAccess.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=\\Dom\D\Data\lab.mdb;"

Все добавления делаются в транзакции, так что не понятно зачем блокируется таблица целиком? Ведь добавляемую в транзакции запись не видно, ее никто не изменит. Как отключить блокировку?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32449823
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Динамический кырсор обязателен? Не помню как у акцеса с ним, попробуй статический.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    Dim rst As New ADODB.Recordset
    Dim sql As String

    sql =  "SELECT * FROM Products Where Id_Product = 1 "
    
    rst.Open sql, cnnAccess, adOpenStatic, adLockOptimistic
    
    With rst
        .AddNew
            !Id_Customer = Id_Customer
        .Update
    End With
    
    rst.Close
    Set rst = Nothing


или
adopenKeyset - что для твоего случая было бы вернее.

Magnus
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32451424
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
adopenKeyset работает, как это можно объяснить на словах? Почему, за счет чего?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32451501
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает?
Ок. Динамический курсор в любом случае, по определению , должен быть на стороне сервера а значит лок таблицы. KeySet - на стороне клиенте, т.е. просто снэпшот таблицы, поэтому и лок не нужен.

Magnus
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32452664
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как выяснилось adopenKeyset работает не блокирую таблицу если работа идет всего с одной таблицей, однако же в проге у меня все равно после открытия рекордсета adopenKeyset и вызова Update вся таблица блокируется от изменений, сам Access при этом выдает: <Обновление невозможно; установлена блокировка>
Значит дело не в курсоре а в блокировке? Или транзакцию я не так открыл?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454147
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Help!!!
Горю, люди!
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32454338
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят, обнаружилось что все же блокируется не вся таблица, а некоторая ее часть (называется страница?). Уже лучше. Как бы добиться блокировки только одной записи.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455274
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знач так, будем делать по-другому.
поставь adOpenBatchOptimistic
И апдейт вызывай только после добавления всех записсей, методом UpdateBatch.

Magnus
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455779
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23
Дык я не могу вызывать апдейт после добавления всех записей, мне именно после каждой нужно, а нужно для того чтобы получить ID добавленной записи для занесения в другую таблицу. И этот ID появляется как раз после Update
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32455811
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По идее при adLockOptimistic и должна блокироваться только запись на которую вызван апдейт.
Уж и не знаю, все воде верно. попробуй спросить в Акцесе.

Magnus
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32457177
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дык я не могу вызывать апдейт после добавления всех записей, мне именно после каждой нужно, а нужно для того чтобы получить ID добавленной записи для занесения в другую таблицу. И этот ID появляется как раз после Update

А что тебе мешает после UpdateBatch получить сразу все ID и добавить их все сразу?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32457336
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Схема такая: я добавляю нового клиента и тут же вешаю на него специфический заказ, зависящий от параметров клиента.
Если я добавлю клиентов через UpdateBatch и потом получу сразу все добавленные ID, то как я узнаю какой из ID какому клиенту принадлежит чтобы правильно добавить заказ?

И как ты себе представляешь после UpdateBatch получить сразу все ID ?
Я не в курсе, может есть какой механизм?
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32457357
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Последние пять лет так делаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    cn.CursorLocation = adUseClient
    cn.Open 
    rs.Open cmd, cn, adOpenStatic, adLockBatchOptimistic
    Set rs.ActiveConnection = Nothing 'по желанию
    rs.AddNew 'манипуляции.....
    rs.AddNew 'манипуляции.....
    ap = rs.AbsolutePosition
    Set rs.ActiveConnection = cn 
    rs.UpdateBatch
    'теперь в rs есть ID
    If ap >  0  Then rs.AbsolutePosition = ap 'для красоты
    Set rs.ActiveConnection = Nothing
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32458010
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rs.Open cmd , cn, adOpenStatic, adLockBatchOptimistic\r
\r
Под cmd у тебя подразумевается некий Select?\r
\r
Set rs.ActiveConnection = Nothing \'по желанию\r
rs.AddNew \'манипуляции.....\r
\r
Как же так ты добавляешь данные в рекордсет (то бишь в таблицу) когда у тебя ActiveConnection = Nothing ???\r
\r
Это для меня пока не понятно.\r
\r
Кстати если интересно вот почитай что насоветовали в Access
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32458137
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Казалось бы, не в тему, однако...
PantaloneКак же так ты добавляешь данные в рекордсет (то бишь в таблицу) когда у тебя ActiveConnection = Nothing ???
В качестве одного из ключевых преимуществ ADO.NET подавляющее большинство авторов хвалебных рецензий
подчёркивают возможность работы со snapshot'ом - не надо держать множество открытых подключений.
Сама же MS говорит, что прежние версии ADO by default загружают сервак открытыми коннектами.
А если немного внимательнее почитать книжки, то by default можно работать так, как Antonariy.
(опять мимо темы:) FoxPro не позволяет этого в принципе.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32458997
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Pantalone:
Под cmd у тебя подразумевается некий Select?

Ага.

Как же так ты добавляешь данные в рекордсет (то бишь в таблицу) когда у тебя ActiveConnection = Nothing ???


Это называется отсоединенный рекордсет. После всех манипуляций соединение восстанавливается, рекордсет апдейтится и записи добавляются, обновляются или удаляются как ни в чем не бывало.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32459485
Pantalone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это называется отсоединенный рекордсет. После всех манипуляций соединение восстанавливается, рекордсет апдейтится и записи добавляются, обновляются или удаляются как ни в чем не бывало.

Да это же просто здорово!!! Полезная фишка, как-нибудь воспользуюсь.
Но метод AddNew при отсоединении рекордсета не вернет мне ID новой записи? Такое возможно только при наличии соединения? Это очень важно, пожалуйста ответьте.
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32459633
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Id -identity?
Только после подключения и вызова апдейта.

Magnus
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32469424
FoxGuest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Processor

автор
В качестве одного из ключевых преимуществ ADO.NET подавляющее большинство авторов хвалебных рецензий
подчёркивают возможность работы со snapshot'ом - не надо держать множество открытых подключений.
Сама же MS говорит, что прежние версии ADO by default загружают сервак открытыми коннектами.
А если немного внимательнее почитать книжки, то by default можно работать так, как Antonariy.

(опять мимо темы:) FoxPro не позволяет этого в принципе

Да уж... куда фоксу до ADO.Net - светилы прогресса :) В Visual FoxPro выборка с сервера попадает в фоксовский курсор (временая таблица). С которым можно делать что угодно, включая экспортирование и импортирование в dbf одной командой, редактирование xBase и SQL-инструкциями, индексацию, натравление на него любого количества SQL-запросов, копирование в другие таблицы или из других таблиц. Его можно сохранить в dbf, выключить комп, пойти поспать, а назавтра указать его как обновляемый SPT-курсор, приконнектиться и залить на сервак. Вот тебе и снапшот. И еще есть Offline-представления, которые это дело автоматизируют. И доступно это со времен VFP 3.0 (1995-й год). Так что про "в принципе" сказки рассказывать не надо
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32469501
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To FoxGuest
Извини, не хотел "в принципе" обидеть.
Мне рассказывали (сам на FoxPrpo не работаю), что FoxPro "так устроен, что надо держать коннекшн открытым", да ещё и не один.
(По крайней мере, я это наблюдаю в Management-->Current Activity--Process Info: 358 Items, Status: Sleeping).
Не это ли ты имел ввиду, когда говорил "пойти поспать" ? ;-)))
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32469773
FoxGuest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторИзвини, не хотел "в принципе" обидеть.
Да ладно, мне по фигу :)

авторМне рассказывали (сам на FoxPrpo не работаю), что FoxPro "так устроен, что надо держать коннекшн открытым", да ещё и не один.
Ну мало ли у кого руки и головы кривые. Не мне тебе рассказывать про драйвер ruki.sys :) Особенно про "еще и не один" весело

авторНе это ли ты имел ввиду, когда говорил "пойти поспать"? ;-)))
Я имел в виду то, что имел в виду. А именно то, что в фоксе любая выборка к любому источнику (DBF, DBC (БД VFP), Oracle, MS SQL, Interbase....) - есть независимый от коннекшена курсор, который в том числе легко одной командой (COPY TO) экспортируется в dbf, и вытягивается обратно (APPEND FROM) при необходимости. Как понимаетшь, активный коннекшен - это "параллельное" к курсору явление, так сказать его "приписка", и никак он к нему не привязан и для импорта/экспорта не нужен. Коннект в любой момент можно закрыть, редактировать курсор, а потом опять открыть и обновить. Это я все к разговору о якобы "революционных" снэпшотах ADO.Net
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32469777
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не понимаю откуда вообще эти разговоры в АДО отсоедененные рекордсеты существуют давно , работать с ними очень даже просто.

Пачки же открытых коннектов - это недобитый пулинг. С этой зверюгой осторожно обращаться нужно и использовать только когда точно знаешь что делаешь, а во пбщих случаях отключать и делать все руками.
Такова уж история, очень часто подобные "помогающие" или призванные "что то сделать за нас" технологии делают это криво и после долгих боев все возвращается на круги своя.


***Здесь была афигительная картинка с вашим адресом а теперь будет Просто Реклама***
Magnus
...
Рейтинг: 0 / 0
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
    #32473918
Processor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To FoxGuest:
Спасибо за образные сравнения и толковое разъяснение.
Мои коллеги, которым я показал твой ответ, сказали, что это - рудименты перехода от 2.6 к VFP и последующего переноса данных на MS SQLServer.
Старые приложения крутятся - и ладно. А новые - используют ADO из-под VFP.

To Magnus
Действительно давно, и я этим пользуюсь с 2000 года.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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