Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2008, 10:33   #1
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
Вопрос ADO + SQL Server. Как правильно организовать одновременную работу с таблицей

Здравствуйте,

Программлю только по необходимости, в основном автоматизация и иже с ней, т.е. не гуру и не близко)), но вот появилась такая задача : сделать софтинку для подачи заявок пользователями и редакция админами.

Организовал так : ADOConnection->ADODataSet->DataSource
И все бы ничего ... но при одновременной редакции одной строки у одного из них вылазит сообщение о том, что запись изменена, а обновлений нет.

Вопрос : как правильно организовать одновременную редакцию несколькими пользователями? Поясню, скажем, во-первых чтобы два разных пользователя могли безболезненно редактировать разные поля и одно и тоже поле ( чтобы вылезло мол "а кто-то уже поменял на вот это ххх, чего бум делать? ).

И еще одно : можно ли организовать реал-тайм обновление у пользователей? ( т.е. один изменил - а у всех остальных изменения появились )

Спасибо, надеюсь на нисхождение, с ADO и SQL программлю первый раз))
Mouse123 вне форума Ответить с цитированием
Старый 25.06.2008, 10:49   #2
Speeker
Форумчанин
 
Аватар для Speeker
 
Регистрация: 01.12.2006
Сообщений: 241
По умолчанию

А что если организовать таблицу в которой отмечать работу с таблицей. Например: Таблица содержит названия других таблиц и числовое значение. Если таблицей пользуются значит значение равно единице, если нет - нулю. Когда пользователь заходит - сообщение "с данной таблицей уже работают пользователи" А вот с обновлением в реал тайме... сложнее я думаю...
опять таки скажем таблица были ли внесены изменения. И при внесении изменений значение изменяется на единицу. Но клиентское приложение должно регулярно опрашивать эту таблицу и если изменения были внесены - обновлять. Вот такое пока тока пришло в голову...
Програмисты - единственные люди, которым платят за исправления их же ошибок
Speeker вне форума Ответить с цитированием
Старый 25.06.2008, 11:01   #3
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
По умолчанию

На сколько я понимаю сам ADO'шный DataSet смотрит в поле перед постом и если оно отличается от того, что было перед началом edit'a, то все, кирдык, в принципе это можно попробЫвать обойти. Главный вопрос в другом - можно ли как-то наиболее легко и просто организовать одновременную редакцию одной таблицы 3-4 юзверами? Например, чтобы в поле комментариев они могли переписыватся.... Неужели все так сложно? Возможно как то можно это реализовать за счет серверной части? ( у меня SQL Server 2005 EE SP2 с доменными политиками доступа )
Mouse123 вне форума Ответить с цитированием
Старый 25.06.2008, 12:14   #4
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Почитайте про транзакции и блокировки в MS SQL. Тогда я думаю вопрос об одновременной редакции несколькими пользователями отпадет.
edgy вне форума Ответить с цитированием
Старый 25.06.2008, 12:24   #5
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
По умолчанию

Цитата:
Сообщение от edgy Посмотреть сообщение
Почитайте про транзакции и блокировки в MS SQL. Тогда я думаю вопрос об одновременной редакции несколькими пользователями отпадет.
А можно просто в кратцах рассказать? Времени нет ни разу, мне бы понять от чего толкнутся именно и все ок будет))
Mouse123 вне форума Ответить с цитированием
Старый 25.06.2008, 13:12   #6
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Ну в очень краткой форме можете прочитать, например здесь.
От себя добавлю, что управлять транзакциями можно как с сервера ( как это делается описано в ссылке, которую я вам дал ), так и с клиента.
С клиента это делается следующим образом ( упрощенно ):

Код:
try
  ADOCommand1.CommandType := cmdText;
  ADOCommand1.CommandText := 'Текст запроса';
  ADOCommand1.Parameters.ParamValues[ 'name_parameter' ] := ...
  ...
  ADOConnection1.BeginTrans;   // начинаем транзакцию
  ADOCommand1.Execute;        // Выполняем запрос
  ADOConnection1.CommitTrans;   // фиксируем транзакцию
except on E:Exception do
  begin
     ADOConnection1.RollbackTrans;   // в случае не успеха делаем откат 
                                                  // транзакции
     ....
  end;
end;
edgy вне форума Ответить с цитированием
Старый 26.06.2008, 10:00   #7
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
Радость

Большое спасибо за помощ!

Но у меня возникает вопрос : использование транзакций, на сколько я пока понял, подразумевает непосредственно код SQL, а в таком случае выходит что пользовать автоматические изменения вносимые DB-компонентами нельзя? Или ...
Mouse123 вне форума Ответить с цитированием
Старый 26.06.2008, 10:21   #8
D-mon
Форумчанин
 
Регистрация: 22.06.2007
Сообщений: 414
По умолчанию

Повесь обновление БД на таймер, и каждые N секунд обновляй.
Нет невыполнимых задач, всё дело времени...
D-mon вне форума Ответить с цитированием
Старый 26.06.2008, 10:37   #9
Mouse123
Пользователь
 
Регистрация: 25.06.2008
Сообщений: 22
По умолчанию

Логично для обновления, но, к сожалению, не поможет когда данные меняются другим пользователем ...
Mouse123 вне форума Ответить с цитированием
Старый 26.06.2008, 10:45   #10
edgy
Форумчанин
 
Регистрация: 15.06.2008
Сообщений: 271
По умолчанию

Любые изменения данных в БД делаю только с помощью запросов или хранимых процедур. Т.е. скажем если пользователь ввел/отредактировал данные, то после этого должен нажать кнопку "Сохранить", и только после это сохраняю в БД все изменения. А если пользователь забыл нажать кнопку "Сохранить", то при закрытии формы вывожу диалоговое окно ( показываю это окошко только тогда, когда данные гарантировано были изменены ), где спрашиваю - сохранить данные или нет. Т.е. вполне возможны ситуации когда пользователь может вообщем-то может передумать и отказаться от изменений.
Транзакции и блокировки гарантируют, что пока сохранялись данные одного пользователя, изменения тех же данных другим пользователем проведены не будут.
edgy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не отображаются данные связанные с гл. таблицей? zimmion БД в Delphi 11 27.02.2008 18:50
Проблема с таблицей May1980 Microsoft Office Word 2 16.01.2008 20:43
Помагите с таблицей Римма БД в Delphi 2 31.08.2007 14:09
Работа с таблицей без БД Гр_ БД в Delphi 3 06.06.2007 16:31
Как связать кнопку с таблицей Таня84 БД в Delphi 1 31.01.2007 14:02