Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 |

 

  Вопрос: Клиент-сервер Добавлено: 06.09.04 05:52  

Автор вопроса:  Mihalыch | ICQ: 373-509-101 
Такой вопрос: есть локальная сеть, на компьютерах которой установлены клиентские модули программы, один из компьютеров работает как сервер, на нем находится база данных Access, в которую клиентские модули через DLL расположенную на «сервере» передают данные. Скорее всего, в случае одновременной записи данных в базу произойдет ошибка. Как это обойти?

Помогите, кто может! Заранее благодарен!

Ответить

  Ответы Всего ответов: 10  

Номер ответа: 1
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #1 Добавлено: 06.09.04 08:10
Может как-нибудь выстраивать их в очередь?
Типа If Server.IsBusy then <в очередь>. Ну или что-то в роде этого.

Ответить

Номер ответа: 2
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #2 Добавлено: 06.09.04 08:22
В том то и дело, как выставить? Я делал так перед тем как клиент начинает передавать данные создаю в корне сервера «сигнальный файл», а по окончании удалю его. Но как-то это не очень!

Ответить

Номер ответа: 3
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #3 Добавлено: 06.09.04 08:31
Я бы сделал еще один Winsock/Тягу/др. для обработки этого запроса. Он всегда подключен и запрашивает состояние. Или так: отсылать всем клич, типа: "Свободен", и кто первый успел, то тот коннектится и сервер дает еще один клич, что он занят. Наверное так...

Ответить

Номер ответа: 4
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #4 Добавлено: 06.09.04 08:54
Из второго варианта можно попробовать ченить выжать. Но все равно, я понимаю так: когда один клиент передает dll’ке «дату» для записи в базу, он грузит ее в «свое адресное пространство», другой тоже и еще другой тоже и так далее т.е. ента млин dll’ка ни че не знает о том, что кто то уже пишет в базу. Вот если бы можно было бы спросить у базы, чем она шас занимается!? А вообще слышал, что есть какая то программа от мелкомягких, которая и устраивает енту очередь. Может подскажешь где такое можно взять, вроде она входит в стандартный набор Виндовс?

Ответить

Номер ответа: 5
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #5 Добавлено: 06.09.04 09:13
Эх, знать бы мне ее название - сказал бы его...

Ответить

Номер ответа: 6
Автор ответа:
 ol2003



Вопросов: 3
Ответов: 122
 Профиль | | #6 Добавлено: 07.09.04 06:09
База данных закрывает таблицу на время внесения записи. Поэтому одновременное внесение 2-х и более записей невозможно. Не забивай сесбе этим голову.

Ответить

Номер ответа: 7
Автор ответа:
 Born



ICQ: 178155071 

Вопросов: 21
Ответов: 52
 Профиль | | #7 Добавлено: 07.09.04 06:34
А если транзакцию создавать когда пишишь в базу и монопольно держать таблицу. Тогда другой будет ждать..

Ответить

Номер ответа: 8
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #8
Добавлено: 10.09.04 10:58
См. LockTypeEnum (ADODB): н-р, adLockPessimistic, если ты так боишься ошибок. Константы LockType определяют, как поведет себя твоя многопользовательская база в конфликтных ситуациях. См.тж. CursorTypeEnum: н-р, adOpenDynamic... Все конфликтные ситуации база разрешает сама, тебе правда надо при этом грамотно обрабатывать сообщения об возникающих ошибках блокировки. Удачи!

Ответить

Номер ответа: 9
Автор ответа:
 Mihalыch



ICQ: 373-509-101 

Вопросов: 56
Ответов: 330
 Профиль | | #9 Добавлено: 10.09.04 18:18
Транзакция используется, но это не помогает, нет окат конечно происходит, но после этого приходится снова вызывать процедуру сохранения данных. Всевозможные типы курсора adLockPessimistic и режимы открытия объекта Connection adModeShareDanyWrite, adModeShareExclusive и т.д., как мне кажется, действуют только в контексте конкретного экземпляра объекта Connection. Т.е. когда очередной клиентский модуль делает Dim cnnConnection As New ADODB.Connection, то этому New cnnConnection абсолютно феалетово какие кто-то установил режимы, свойства. Возможно я ошибаюсь.
А вообще решение проблемы есть! Правда еще до конца не разобрался. Но то, что уже известно выглядит так: при создании dll в меню Project нужно выбрать команду Project Properties, на вкладке Component нужно поставить птицу в CheckBox’е Remote Server Files. Тогда после компиляции будет создан файл с расширением *.vbr. Далее при создании инсталлятора для серверного модуля необходимо захватить dll’ку, а при создании инсталлятора для клиента этот файл. Далее: сначала инсталлируем серверный модуль, после чего во время инсталляции клиента (во всяком случае VBшный Package… это делал) будет предложено указать имя компьютера, на котором зарегистрирована dll’ка. После этого св-ва, методы, события dll’ки будут доступны даже во время отладки на клиентской машине, хотя самой dll’ки на этом компьютере нет. Это с чем разобрался.
А вот с этим пока нет: для установления очереди есть специальная библиотека для того, что бы она появилась в References необходимо в панели управления в Установке и удалении программ выбрать установка компонентов Windows, а там выбрать Очередь сообщений и установить весь состав. Потом в меню Project нужно выбрать команду References и подключить библиотеку Microsoft Queue 3.0 Object Library, дальше
    ;Dim myQueue As MSMQQueueInfo
    Set myQueue = New MSMQQueueInfo
    myQueue.Create 'дальше пока не знаю
Согласен, как то очень запутано, но вдруг сработает. Может кто знает то чего я не знаю. За помощь, сочувствие или просто проявленный интерес всем спасибо!

Ответить

Номер ответа: 10
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #10
Добавлено: 11.09.04 14:36
Вопрос: про какую dll ты говоришь, если честно я не знаю? Про MSMQQueueInfo я вряд ли подскажу. Просто раз ты делаешь такую серьезную сетевую программку, может тебе писать её не под Access, а под MS SQL Server? Ведь одна из основных его задач-целостность данных в многопользовательской среде.

>после этого приходится снова вызывать процедуру сохранения данных

И ещё, если записи заблокированы есть два выхода: повторять попытки какое-то время, если время истекает - отменять действия транзакции совсем. Или можно сразу говорить пользователю, что запись заблокирована другим пользователем и пусть он или ждет, или отказывается от того, что хотел первоначально сделать. Короче, в клиентской части д.б. обработка ошибок транзакций. Основательная такая! :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам