Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Перехожу с BDE на ADO. Решил отказаться от DBGrid, DBEdit и т.п. Всё делаю через Edit и ListView (StringGrid). Соответсвенно написал свой код получения записей, сохранения и т.п... но воткнулся в простейшую проблему, когда изменяю запись не могу узнать, не изменил ли ее кто-то еще? Другими словами как сказать MSSQL7ому через ADO Delphi5 locked record? В смысле закрыть эту запись на ReadOnly пока редактирующий ее не отпустит? И как долго она будет ReadOnly? До момента пока юзер не закроет соединение? (Юзеры разные бывают некоторые до сих пор машину Power'ом вырубают , что будет в этом случае?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2001, 10:14 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
А как Вы с помощью BDE решали подобные проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2001, 10:29 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
C BDE было легко - начинаем редактирование клиент 1 (к1) TTable.Edit второй (к2) TTable.Edit к2 - TTable.Post все записывается к1 - TTable.Post BDE выдает сообщение, что данные были изменены, сохранить невозможно. По идее, такой алгоритм можно сделать в ручную - делать Update where и выбрать строчку когда данные всех полей равны изменяемой записи, но хотелось бы чтобы к2 приходило сообщение - к1 уже изменяет, дождитесь завершения операции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2001, 11:20 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
>Другими словами как сказать MSSQL7ому через ADO Delphi5 locked record? В смысле закрыть >эту запись на ReadOnly пока редактирующий ее не отпустит? И как долго она будет >ReadOnly? До момента пока юзер не закроет соединение? (Юзеры разные бывают некоторые до >сих пор машину Power'ом вырубают , что будет в этом случае?) Вы, вероятно, думаете, что BDE использует хитрые механизмы для блокировки записей на период редактирования. Так вот, это не так. Посмотрите с помощью SQL Profiler, что делает BDE и какие SQL команды он посылает на метод Post. Вы увидите, что ничего хитрого там нет, Вы и сами сможете генерить подобные команды. С блокировкой записей это ничего общего не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2001, 05:18 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Да, я это прекрасно понимаю и собственно указал, что действительно реализовать механизм аналогичный BDE нет проблем. Хочется сделать это системой, точнее не так как в BDE, фух зарапартовался. В общем пока я нашел что можно вставить опцию HOLDLOCK, но тут же выяснил, что тогда select count(*) даст результат без этой(их) строки. И надо будет во всех? "расчетных" запросах вставлять NOLOCK ? Еще есть какие предложения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2001, 06:20 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
>Решил отказаться от DBGrid, DBEdit и т.п. Всё делаю через Edit и ListView (StringGrid). Соответсвенно написал свой >код получения записей, сохранения и т.п... А зачем это все, очень интересно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2001, 07:14 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Хмм, сложный вопрос Во-первых чтобы облегчить форму. Во-вторых удобнее записывать код самому по sql update. В-третьих код значительно легче читается. В-четвертых я точно знаю что происходит в любой момент. В пятых, когда Вы открываете SQL select * (или минимум нужных полей) а в таблице записей под 10 000? Вы автоматически скачиваете себе _страницу_ данных (как я это понимаю) я же скачиваю _только_ интересующую меня информацию. В общем, можно долго дискутировать не знаю, возможно это не правильный подход, но мне кажется в многопользовательской системе такой подход более надежен. Так как залочить запись то??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2001, 07:35 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
>Хмм, сложный вопрос Во-первых чтобы облегчить форму. Форму чего? DBGrid так усложняет? > Во-вторых удобнее записывать код самому по sql update. А кто так мешает, зачем обязательно из грида редактировать. Он для показа служит в основном. Причем тут грид вообще. >В->третьих код значительно легче читается. Какой код? Свой? Это уж как напишешь >В-четвертых я точно знаю что происходит в любой момент. Оно и так все всегда известно >В пятых, когда Вы открываете SQL select * (или минимум нужных полей) а в таблице записей под 10 000? Вы автоматически скачиваете себе >_страницу_ данных (как я это понимаю) я же скачиваю _только_ интересующую меня информацию. А тяжело в select * from ... сказать where .... и условие. Зачем все скачивать. И какая разница в этом случае между Вашим StringGrid и DBGrid: все равно все записи из запроса приходится заталкивать туда. > В общем, можно долго дискутировать не знаю, возможно это не правильный подход, но мне кажется в многопользовательской системе такой подход более надежен. Какой подход? Переписывать гриды из-за того, что в Query запрос неправильно написан? Я вообще не понял, чем плохо то, что Вы не используете, хотя делаете то же самое. Всю жизнь работаю с базами данных, никогда ТАКИХ проблем не было. И, кстати, с БД никогда через TTable не работал - это же через зад... >Так как залочить запись то??? При блокировке записи вообще не контролы, не query-ны ни при чем. Я попытался с BDE разобраться, но они лочат по своему помоему, ничего она на сервер не посылает и не проверяет. Можно попробовать через опции селекта: select * from **** with (тут можно много чего поставить, в BOL надо смотреть) Действительно, лочит, но как проверить при update, что запись залочена - не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2001, 11:03 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Был бы ты в моем городе я бы за кружечкой пива сподобился поговорить на эту тему, а через форум пальцы флейм поднимать устанут. Ты отрицаешь мой подход, что ж твое право. БД я программирую давно с 95г и текущая база сам понимаешь, далеко не первая. _Мне_ так работать удобнее. Да, может быть, получается не быстрее тут можно долго спорить, но возможно. В BDE _должно_ быть реализовано следующим образом: кл1 (клиент) select id, p1, p2, p3,..,pN from table1 where id = 1 кл2 select id, p1, p2, p3,..,pN from table1 where id = 1 кл2 update table1 set p1 = 22, p2 = 22,.., pN = 22 where id = 1, p1 = 1, p2 = 1... кл1 update table1 set p1 = 22, p2 = 22,.., pN = 22 where id = 1, p1 = 1, p2 = 1... ответ - ничего изменено не было. Всё генерим сообщение об ошибке. А надо, чтобы кл2 не смог нажать Edit! Улавливаешь разницу? НЕТ? даю скрипт: CREATE PROCEDURE tests17102001 AS CREATE TABLE #TABLE1 ( mid int, p1 int, p2 int, PRIMARY KEY (mid) ); insert into #Table1 (mid,p1,p2) values (1, 11, 11) declare @@mid int declare @@p1 int declare @@p2 int select * from #table1 select @@mid = mid, @@p1 = p1, @@p2 = p2 from #table1 where mid = 1 print 'первый пользователь выбрал запись' select @@mid = mid, @@p1 = p1, @@p2 = p2 from #table1 where mid = 1 print 'второй пользователь выбрал ту же запись' update #table1 set p1 = 22, p2 = 22 where mid = @@mid and p1 = @@p1 and p2 = @@p2 print 'второй пользователь тут же ее изменил' print 'посмотрим:' select * from #table1 print 'наконец-то первый тоже решил ее изменить:' update #table1 set p1 = 33, p2 = 33 where mid = @@mid and p1 = @@p1 and p2 = @@p2 print 'но не смог!' print 'посмотрим:' select * from #table1 drop table #Table1 return ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2001, 12:16 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Попробуй: with (ROWLOCK,UPDLOCK) у меня, кажется, в похожей ситуации работает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2001, 13:16 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Ругательства, подобные BDE может выдавать и ADO. Причем делает это даже тогда, когда в этом нет необходимости (например, при модификации данных этой же таблицы триггером, который срабатывает при модификации, запускаемой с клиента). Так что приходится по большей части бороться не с отсутсвием сообщения о том, что данные изменены другим пользователем, а как раз наоборот - с его ненужным выскакиванием. Методика борьбы с этим явлением разработана Павлом Жидковым (см.этот же форум, самому искать неохота). Суть в том, что при наличии в таблице столбца Identity ADO проверяет значение глобальной переменной @@Identity, и если оно не соответсвует ожиданиям, то выдается соответсвующее сообщение. Данный прием срабатывает при добавлении новых записей в таблицу, и его можно использовать и самостоятельно. А вот для корректной работы с операцией Update обычно используется вспомогательный столбец типа TimeStamp (о его использовании можно почитать в BOL). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2001, 07:48 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Дополнение. А вот запускать блокировки на все время, которое пользователь отошел попить чай, уехал в местную командировку или приостановил редактирование до завтрашнего утра, а сам назавтра заболел - IMHO просто нельзя. Это может привести к неоправданно высокому расходу SQL Server-ом ресурсов (на блокировки требуется море ресурсов). Но самое главное - это может привести к тому, что пользователь 2 вообще не сможет дождаться, когда же ему можно будет что-либо сделать с данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2001, 07:52 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Присоединяюсь к Garya Из последнего сообщения и немного подумав получается вывод и вопрос: Блокировки лучше не использовать, т.к. следуют хорошо описанные Garya последствия, обязательно последуют Тогда можно использовать дополнительное поле для проверки И зачем вообще это нужно, обязательно с одной записью работает куча юзеров? Или запись три дня редактируют, что изменений долго не видно? >А надо, чтобы кл2 не смог нажать Edit! Улавливаешь разницу? Сделать так не очень то реально. Механизм нужно сначала представить и все будет понятно: приложение должно постоянно проверять, а не освободилась ли запись? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2001, 08:24 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
По-моему, используют 2 способа: 1. на редактируемые записи открывают курсор - вроде так делают BDE и ADO. 2. в таблицах делают поле timestamp; когда юзер изменяет запиь, хранимая процедура считывает его, сравнивает с старым значением и, если они разные, говорит: запись изменена, выполнить команду "послать на..."? - такой способ хорошо работает при большой нагрузке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2001, 12:16 |
|
||
|
Абсолютно ламерский вопрос :)
|
|||
|---|---|---|---|
|
#18+
Народ, о чем вы так много говорите? Я пишу на Дельфи. AdoConnection.Connected:=true; try ADOQUery.SQL.Text:='SET LOCKTIMEOUT=5000'; ADOQUery.ExecSQL; ADOQUery.SQL.Text:='Update lalala'; ADOQUery.ExecSQL; except ShowMessage('Запись блокирована в другой сессии или была удалена.'); end; AdoConnection.Connected:=false; Какие проблемы? Отображайте хоть в текстовом формате, каждый пишет как хочет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.10.2001, 13:37 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32015537&tid=1825275]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 264ms |
| total: | 452ms |

| 0 / 0 |
