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

А так, то веть работа идет только с КУРСОРОМ, в базу то запись идет только по команде... MyRecordset.Update
...
Рейтинг: 0 / 0
19.03.2004, 15:31
    #32449534
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Код: 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
19.03.2004, 17:14
    #32449823
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Динамический кырсор обязателен? Не помню как у акцеса с ним, попробуй статический.

Код: 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
22.03.2004, 14:00
    #32451424
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
adopenKeyset работает, как это можно объяснить на словах? Почему, за счет чего?
...
Рейтинг: 0 / 0
22.03.2004, 14:50
    #32451501
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Работает?
Ок. Динамический курсор в любом случае, по определению , должен быть на стороне сервера а значит лок таблицы. KeySet - на стороне клиенте, т.е. просто снэпшот таблицы, поэтому и лок не нужен.

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

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

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

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

И как ты себе представляешь после UpdateBatch получить сразу все ID ?
Я не в курсе, может есть какой механизм?
...
Рейтинг: 0 / 0
25.03.2004, 17:03
    #32457357
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Последние пять лет так делаю:
Код: 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
26.03.2004, 10:24
    #32458010
Pantalone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
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
26.03.2004, 11:20
    #32458137
Processor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
Казалось бы, не в тему, однако...
PantaloneКак же так ты добавляешь данные в рекордсет (то бишь в таблицу) когда у тебя ActiveConnection = Nothing ???
В качестве одного из ключевых преимуществ ADO.NET подавляющее большинство авторов хвалебных рецензий
подчёркивают возможность работы со snapshot'ом - не надо держать множество открытых подключений.
Сама же MS говорит, что прежние версии ADO by default загружают сервак открытыми коннектами.
А если немного внимательнее почитать книжки, то by default можно работать так, как Antonariy.
(опять мимо темы:) FoxPro не позволяет этого в принципе.
...
Рейтинг: 0 / 0
26.03.2004, 16:48
    #32458997
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
2 Pantalone:
Под cmd у тебя подразумевается некий Select?

Ага.

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


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

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

Magnus
...
Рейтинг: 0 / 0
05.04.2004, 16:38
    #32469424
FoxGuest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
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
05.04.2004, 17:12
    #32469501
Processor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
To FoxGuest
Извини, не хотел "в принципе" обидеть.
Мне рассказывали (сам на FoxPrpo не работаю), что FoxPro "так устроен, что надо держать коннекшн открытым", да ещё и не один.
(По крайней мере, я это наблюдаю в Management-->Current Activity--Process Info: 358 Items, Status: Sleeping).
Не это ли ты имел ввиду, когда говорил "пойти поспать" ? ;-)))
...
Рейтинг: 0 / 0
05.04.2004, 22:27
    #32469773
FoxGuest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO Recordset блокирует всю таблицу, нужно блокировать только редактируемую запись.
авторИзвини, не хотел "в принципе" обидеть.
Да ладно, мне по фигу :)

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

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

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


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

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


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