powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Абсолютно ламерский вопрос :)
15 сообщений из 15, страница 1 из 1
Абсолютно ламерский вопрос :)
    #32015397
Vadim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Перехожу с BDE на ADO. Решил отказаться от DBGrid, DBEdit и т.п. Всё делаю через Edit и ListView (StringGrid). Соответсвенно написал свой код получения записей, сохранения и т.п... но воткнулся в простейшую проблему, когда изменяю запись не могу узнать, не изменил ли ее кто-то еще? Другими словами как сказать MSSQL7ому через ADO Delphi5 locked record? В смысле закрыть эту запись на ReadOnly пока редактирующий ее не отпустит? И как долго она будет ReadOnly? До момента пока юзер не закроет соединение? (Юзеры разные бывают некоторые до сих пор машину Power'ом вырубают , что будет в этом случае?)
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015400
PeterG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как Вы с помощью BDE решали подобные проблемы?
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015404
Vadim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
C BDE было легко -
начинаем редактирование клиент 1 (к1)
TTable.Edit
второй (к2)
TTable.Edit
к2 - TTable.Post
все записывается
к1 - TTable.Post
BDE выдает сообщение, что данные были изменены, сохранить невозможно.

По идее, такой алгоритм можно сделать в ручную - делать Update where и выбрать строчку когда данные всех полей равны изменяемой записи, но хотелось бы чтобы к2 приходило сообщение - к1 уже изменяет, дождитесь завершения операции.
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015450
PeterG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Другими словами как сказать MSSQL7ому через ADO Delphi5 locked record? В смысле закрыть >эту запись на ReadOnly пока редактирующий ее не отпустит? И как долго она будет >ReadOnly? До момента пока юзер не закроет соединение? (Юзеры разные бывают некоторые до >сих пор машину Power'ом вырубают , что будет в этом случае?)

Вы, вероятно, думаете, что BDE использует хитрые механизмы для блокировки записей на период редактирования. Так вот, это не так. Посмотрите с помощью SQL Profiler, что делает BDE и какие SQL команды он посылает на метод Post. Вы увидите, что ничего хитрого там нет, Вы и сами сможете генерить подобные команды. С блокировкой записей это ничего общего не имеет.
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015455
_VaV_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, я это прекрасно понимаю и собственно указал, что действительно реализовать механизм аналогичный BDE нет проблем. Хочется сделать это системой, точнее не так как в BDE, фух зарапартовался. В общем пока я нашел что можно вставить опцию HOLDLOCK, но тут же выяснил, что тогда select count(*) даст результат без этой(их) строки. И надо будет во всех? "расчетных" запросах вставлять NOLOCK ? Еще есть какие предложения?
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015460
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Решил отказаться от DBGrid, DBEdit и т.п. Всё делаю через Edit и ListView (StringGrid). Соответсвенно написал свой >код получения записей, сохранения и т.п...

А зачем это все, очень интересно?
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015463
_VaV_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм, сложный вопрос Во-первых чтобы облегчить форму. Во-вторых удобнее записывать код самому по sql update. В-третьих код значительно легче читается. В-четвертых я точно знаю что происходит в любой момент. В пятых, когда Вы открываете SQL select * (или минимум нужных полей) а в таблице записей под 10 000? Вы автоматически скачиваете себе _страницу_ данных (как я это понимаю) я же скачиваю _только_ интересующую меня информацию. В общем, можно долго дискутировать не знаю, возможно это не правильный подход, но мне кажется в многопользовательской системе такой подход более надежен. Так как залочить запись то???
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015489
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Хмм, сложный вопрос Во-первых чтобы облегчить форму.

Форму чего? DBGrid так усложняет?

> Во-вторых удобнее записывать код самому по sql update.

А кто так мешает, зачем обязательно из грида редактировать. Он для показа служит в основном. Причем тут грид вообще.

>В->третьих код значительно легче читается.

Какой код? Свой? Это уж как напишешь

>В-четвертых я точно знаю что происходит в любой момент.

Оно и так все всегда известно

>В пятых, когда Вы открываете SQL select * (или минимум нужных полей) а в таблице записей под 10 000? Вы автоматически скачиваете себе >_страницу_ данных (как я это понимаю) я же скачиваю _только_ интересующую меня информацию.

А тяжело в select * from ... сказать where .... и условие. Зачем все скачивать. И какая разница в этом случае между Вашим StringGrid и DBGrid: все равно все записи из запроса приходится заталкивать туда.

> В общем, можно долго дискутировать не знаю, возможно это не правильный подход, но мне кажется в многопользовательской системе такой подход более надежен.

Какой подход? Переписывать гриды из-за того, что в Query запрос неправильно написан?
Я вообще не понял, чем плохо то, что Вы не используете, хотя делаете то же самое. Всю жизнь работаю с базами данных, никогда ТАКИХ проблем не было. И, кстати, с БД никогда через TTable не работал - это же через зад...

>Так как залочить запись то???

При блокировке записи вообще не контролы, не query-ны ни при чем.
Я попытался с BDE разобраться, но они лочат по своему помоему, ничего она на сервер не посылает и не проверяет.

Можно попробовать через опции селекта: select * from **** with (тут можно много чего поставить, в BOL надо смотреть)
Действительно, лочит, но как проверить при update, что запись залочена - не знаю.
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015499
_VaV_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Был бы ты в моем городе я бы за кружечкой пива сподобился поговорить на эту тему, а через форум пальцы флейм поднимать устанут. Ты отрицаешь мой подход, что ж твое право. БД я программирую давно с 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
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015509
Miha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуй: with (ROWLOCK,UPDLOCK)
у меня, кажется, в похожей ситуации работает.
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015536
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ругательства, подобные BDE может выдавать и ADO. Причем делает это даже тогда, когда в этом нет необходимости (например, при модификации данных этой же таблицы триггером, который срабатывает при модификации, запускаемой с клиента). Так что приходится по большей части бороться не с отсутсвием сообщения о том, что данные изменены другим пользователем, а как раз наоборот - с его ненужным выскакиванием. Методика борьбы с этим явлением разработана Павлом Жидковым (см.этот же форум, самому искать неохота). Суть в том, что при наличии в таблице столбца Identity ADO проверяет значение глобальной переменной @@Identity, и если оно не соответсвует ожиданиям, то выдается соответсвующее сообщение. Данный прием срабатывает при добавлении новых записей в таблицу, и его можно использовать и самостоятельно. А вот для корректной работы с операцией Update обычно используется вспомогательный столбец типа TimeStamp (о его использовании можно почитать в BOL).
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015537
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дополнение. А вот запускать блокировки на все время, которое пользователь отошел попить чай, уехал в местную командировку или приостановил редактирование до завтрашнего утра, а сам назавтра заболел - IMHO просто нельзя. Это может привести к неоправданно высокому расходу SQL Server-ом ресурсов (на блокировки требуется море ресурсов). Но самое главное - это может привести к тому, что пользователь 2 вообще не сможет дождаться, когда же ему можно будет что-либо сделать с данными.
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015542
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Присоединяюсь к Garya

Из последнего сообщения и немного подумав получается вывод и вопрос:
Блокировки лучше не использовать, т.к. следуют хорошо описанные Garya последствия, обязательно последуют
Тогда можно использовать дополнительное поле для проверки
И зачем вообще это нужно, обязательно с одной записью работает куча юзеров? Или запись три дня редактируют, что изменений долго не видно?

>А надо, чтобы кл2 не смог нажать Edit! Улавливаешь разницу?
Сделать так не очень то реально. Механизм нужно сначала представить и все будет понятно: приложение должно постоянно проверять, а не освободилась ли запись?
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015565
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, используют 2 способа:
1. на редактируемые записи открывают курсор - вроде так делают BDE и ADO.
2. в таблицах делают поле timestamp; когда юзер изменяет запиь, хранимая процедура считывает его, сравнивает с старым значением и, если они разные, говорит: запись изменена, выполнить команду "послать на..."? - такой способ хорошо работает при большой нагрузке.
...
Рейтинг: 0 / 0
Абсолютно ламерский вопрос :)
    #32015581
Виктор Светлов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ, о чем вы так много говорите? Я пишу на Дельфи.

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;

Какие проблемы? Отображайте хоть в текстовом формате, каждый пишет как хочет
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Абсолютно ламерский вопрос :)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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