Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / BDE и локальное размещение БД / 24 сообщений из 24, страница 1 из 1
24.01.2005, 14:02
    #32880041
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Ситуация такая. Есть приложение, которое работает с БД типа dBASE
через BDE (средствами Table, Query, DataSource, DBGrid). Никаких серверных технологий не применяется. Работа с удаленной или локальной БД происходит
просто через смену алиаса. Так вот, если 2 клиента работают с данными
со своих терминалов, а БД находится "на 3-й машине", то проблем с совместным доступом не наблюдается. Но стоит перенести БД на одну из
машин клиента, то при совместном доступе , редактированные данные
сохраняются только у клиента с локальной базой. Тот кто работает с
удаленной базой работает с кэшированными данными (хотя кэширование
я не включаю) и не одна строка изменений реально в базу не записывается
(напомню при совместном доступе).
Есть ли какое-то решение такой ситуации, не прибегая к коренной смене кода, т.е. не переходя на другую технологию ...
...
Рейтинг: 0 / 0
24.01.2005, 14:19
    #32880113
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
не могу утверждать =), но может проканает:
а) все изменения вносить руками, i.e.: программно генерить query и его исполнить.
б) попробовать пошагово посмотреть весь путь записи изменений в бд: может быть, что локальный клиент lock'ит бд, и сетевой просто натыкается на исключение, к-рое прога обрабатывает, не ставя тебе в известность об оном.
в) ну и на всякий случай: alias какой? "\\%servername%\%path%" или
"%networkdrive%\%path%"???
...
Рейтинг: 0 / 0
24.01.2005, 15:00
    #32880251
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
а) alias у локального "d:\test"
у удаленного " \\user1\d\test"
б) Мне кажется, что BDE у клиента, работающего в локале, видит что база локальная и не беспокоется за остальные соединения. Поэтому при сохранении и пишет только свои данные...
...
Рейтинг: 0 / 0
24.01.2005, 15:06
    #32880280
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
а, таки, если ч/з breakpoint'ы глфнуть на работу удаленного клиента?
...
Рейтинг: 0 / 0
24.01.2005, 15:18
    #32880321
_Sania
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Может стоит попробовать БД Paradox, в нем реализованна совместная работа по сети, для BDE - это наиболее удобный формат.
...
Рейтинг: 0 / 0
24.01.2005, 17:16
    #32880735
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Paradox это хорошо, но сейчас этот вариант не расматривается. Сижу на ПК
"локального" клиента и смотрю чего делает удаленный. Запускаю
приложение и ничего не делаю, кроме того, что открыл
тестируемую таблицу. Ни одного изменения, что сделал "удаленный"
я не вижу (не в приложении, не через DataBase Desktop).
Однако все изменения удаленного клиента я вижу через real-time просмотрщик WinDBFview. Дальше развитие событий следующе:
- если я выхожу, не делая Post, то все изменения удаленного клиента
будут реалбно внесены в таблицу.
- если я делаю Post, то в таблицу будут добавлены только мои записи.
...
Рейтинг: 0 / 0
24.01.2005, 17:29
    #32880802
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
мне кажется (и только кажется =) ), что тоут все аналогично vc++ ,net:
данные сперва вносятся в отсоединенные данные (читай, кэшированные), а потом уже в бд. потому-то все изменения удаленного клиента я вижу через real-time просмотрщик WinDBFview
ибо это изменения в кэшированных данных. плз, скажи, что делает post? ибо я давно не сижу в bcb.
...
Рейтинг: 0 / 0
24.01.2005, 17:40
    #32880849
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Своим Post-ом (сохранением данных после редактирования или добавления
записи) я перебиваю всю работу удаленного клиента. Потому как мне кажется
мои новые данные "матрицей" накладываются на таблицу, где новых записей
от удаленного клиента нет...
...
Рейтинг: 0 / 0
24.01.2005, 17:56
    #32880908
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
погодь, локальный и удаленный клиенты создают свои копии connect'а к бд, так? не может ли быть так, что локальный клиент lock'ит бд, тем самым просто не давая удаленному что бы то ни было записать в бд? т.е., реализует транзакцию. =///
...
Рейтинг: 0 / 0
24.01.2005, 17:57
    #32880911
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
т.е., что если перед post'ом локальным вызывать принудительно post на удаленном клиенте?
...
Рейтинг: 0 / 0
24.01.2005, 19:23
    #32881101
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
13th_apostleпогодь, локальный и удаленный клиенты создают свои копии connect'а к бд, так? не может ли быть так, что локальный клиент lock'ит бд, тем самым просто не давая удаленному что бы то ни было записать в бд? т.е., реализует транзакцию. =///
в какой-то степени я с этим согласен
13th_apostleт.е., что если перед post'ом локальным вызывать принудительно post на удаленном клиенте?
а это мысль, только как это сделать?
...
Рейтинг: 0 / 0
25.01.2005, 11:45
    #32881943
13th_apostle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
мне кажется, что у тебя connection открыт на протяжении всей работы проги, так? если да, то в этом и проблема, imho: попробуй открывать connection только при окончательной записи измененных кэшированных данных в бд. и делать это транзакциями: тогда, когда удаленный клиент откроет соединение, он сам залочит бд. что касается принудительного вызова post'а... не знаю... =(
/*n.b.: все, что я грю, может оказаться чистым флеймом; мне это не проверить сейчас, и я грю наобум =)*/
...
Рейтинг: 0 / 0
25.01.2005, 13:31
    #32882288
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
13th_apostleмне кажется, что у тебя connection открыт на протяжении всей работы проги, так?
Да конечно.
Попробую твой совет...
...
Рейтинг: 0 / 0
25.01.2005, 15:33
    #32882665
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Нашел одну статейку правда для БД Paradox, а не dBASE:

Использование баз данных Paradox в локальной сети "Knowledge itself is power"
F.Bacon
Использование баз данных Paradox в локальной сети
Раздел Hello, World!Автор Егоров Алексей,
дата публикации 30 апреля 2002г.

Хотелось бы поделиться опытом использования баз данных Paradox в локальной сети.
По большому счету, принципы распределенного и локального доступа к таблицам
Paradox ничем не отличаются. Исключения составляют некоторые правила и
рекомендации, которые изложены ниже...
В последнее время в сторону BDE раздается много замечаний и нареканий по
поводу ограниченности и ненадежности при организации сетевого доступа к файлам
БД.
Существует множество решений и хитростей, призваных облегчить жизнь
разработчику, работающему с BDE. Как показывает опыт, такие эксперименты чаще
всего приводят к частичной и полной потере данных в файловых таблицах...
Отсюда правило первое : если вы хотите использовать Paradox в сети, установите
BDE в полном объеме на каждой клиентской машине, включая ту, где находятся
файлы базы данных. Обязательны следующие установки в конфигурации на каждой
машине :
Это предотвратит Sharing Violation :
BDE->Configuration->System->Init : LOCAL SHARE = TRUE
BDE->{Самое важное}
Это предотвратит неразбериху в местоположении данных.

BDE не работает с базами данных напрямую, как например \\head\C\Database.
Диск с данными необходимо подключить как сетевой. Еще лучше, если буквы
сетевого диска будут одинаковыми на всех машинах...
BDE->Configuration->Drivers->Native->Paradox : NETDIR = F:\Databse,
BDE->где F = \\head\c\

Возникает резонный вопрос : а что если баз данных несколько?
Тогда в качестве NETDIR необходимо указать корневой каталог, в нашем случае
F.
Если вы работаете с файловыми базами данных, то вам необходимо воспринимать
BDE как некоторый сервис, как скажем, interbase. Сравнение конечно не из
лучших, однако нормально работающий BDE - залог сохранности и надежности
ваших данных.
К вопросу о Refresh.
Если вы работаете локально, то никаких проблем с обновлением набора данных у
вас не возникает. При изменении данных, вы сразу видите результат на экране. В
сети ситуация несколько иная : пользователи на других компьютерах не видят тех
изменений, которые происходят без их участия. Конечно, ничто не мешает нам
через определенные интервалы времени обновлять элементы управления с помощью
Refresh, однако не очень приятно наблюдать за тем, как ваша программа
превращается в новогоднюю елку, постоянно мерцая элементами управления.
Проблема решается с помощью BDE Callback Functions :
// Объявления...
Код: plaintext
1.
2.
3.
4.
5.
6.
 TForm1 = class(TForm)
// ...
public
 function TableChangeCallBack(CBInfo: Pointer): CBRType;
 procedure UpdateTableData(var Msg: TMessage); message WM_UPDATETABLE;
 procedure TablesAfterOpen(DataSet: TDataSet);
end; 

// Реализация...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
function TForm1.TableChangeCallBack(CBInfo: Pointer): CBRType;
 begin
  PostMessage(Handle, WM_UPDATETABLE,  0 ,  0 );
 end;

procedure TForm1.UpdateTableData(var Msg: TMessage);
 Var
   Index : Integer;
 begin
  For Index :=  0  To DBDataModule.ComponentCount -  1  Do
  // DBDataModule - это Data module, в котором находятся все
  // TTable нашего   проекта...
     If DBDataModule.Components[Index] Is TTable Then
       If TTable(DBDataModule.Components[Index]).State = dsBrowse 
       then TTable(DBDataModule.Components[Index]).Refresh;
 end;

procedure TForm1.TablesAfterOpen(DataSet: TDataSet);
 begin
  TBDECallback.Create(Self, TTable(DataSet).Handle, cbTableChanged, nil,  0 ,
TableChangeCallBack, True);
 end;

// На событие OnCreate в Data Module подключаем наши функции к TTable...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
procedure TDBDataModule.DBDataModuleCreate(Sender: TObject);
 Var
   Index : Integer;
begin
 For Index :=  0  To ComponentCount -  1  Do
    If Components[Index] Is TTable Then
      TTable(Components[Index]).AfterOpen := Form1.TablesAfterOpen;
end;
Но и это еще не все... Теперь нам нужен TTimer...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.FrashmanTimer(Sender: TObject);
 Var
   Index : Integer;
begin
 Try
  For Index :=  0  To DBDataModule.ComponentCount -  1  Do
     If DBDataModule.Components[Index] Is TTable Then
       If (TTable(DBDataModule.Components[Index]).Active)
         And
          (TTable(DBDataModule.Components[Index]).State = dsBrowse) Then
           DBIForceReRead(TTable(DBDataModule.Components[Index]).Handle);
 Except End;
end;

Сохранность данных в сети.
Для того чтобы быть уверенным в сохранности данных, необходимо на событие
AfterPost Компонета TTable назначить следующее :
dbiSaveChanges(TTable(DataSet).Handle);
Блокировки.
Существует два подхода к разделенному изменению данных : оптимистический и
писсимистический. В первом случае речь идет о клиент-сервере и транзакциях.
Иначе говоря, сколько угодно пользователей могут одновременно изменять одни и
те же данные.
В нашем случае такой возможности просто не существует. Необходимо самим
предусмотреть ситуацию, когда пользователи, например, попытаются одновременно
редактировать одну и ту же запись. Ничего страшного, кроме сообщения "record
locked by another user", не произойдет.
Однако желательно самим обработать данную ситуацию. Вот пример функции,
которая проверяет, заблокирована запись или нет :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Function IsRecordLocked(Table: TTable) : Boolean;
  Var
   Locked: BOOL;
   hCur: hDBICur;
   rslt: DBIResult;
begin
   Table.UpdateCursorPos;
   Check (DbiIsRecordLocked (Table.Handle, Locked));
   Result := Locked;
   if (Result = False) then
     begin
      Check(DbiCloneCursor (Table.Handle, False, False, hCur));
      try
       rslt := DbiGetRecord (hCur, dbiWRITELOCK, nil, nil);
       if rslt <> DBIERR_NONE then
         begin
          if HiByte (rslt) = ERRCAT_LOCKCONFLICT then Result := True
            else Check (rslt);
         end
       else
         Check (DbiRelRecordLock (hCur, False));
      finally
       Check (DbiCloseCursor (hCur));
      end;
   end;
end;
Для полного счастья неплохая ссылка на ресурс с функциями BDE плюс примеры их
использования
http://www.priv.bus.at/graf/quell/delphiarchives/bdehlp32/contentpage.htm
Егоров Алексей
апрель 2002г.


© При использовании любых материалов «Королевства Delphi» необходимо указывать
источник информации.
==========================================================

Описано не плохо только я не силен в BCB, а в Delphi ещё хуже.
Может мне кто-нибудь переложить коды этих ф-й и процедур на Builder?
Буду очень признателен!
==========================================================
...
Рейтинг: 0 / 0
26.01.2005, 08:24
    #32883647
_Sania
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Решился перейти на Paradox?
Наиболее критичны два первых совета (они есть в любом приличном руководстве по local BDE), которые про local share и net dir, остальное - только улучшения, в принципе будет работать и так.

Для dBase - это все не работает.
...
Рейтинг: 0 / 0
26.01.2005, 10:39
    #32883893
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
_SaniaРешился перейти на Paradox?
Наиболее критичны два первых совета (они есть в любом приличном руководстве по local BDE), которые про local share и net dir, остальное - только улучшения, в принципе будет работать и так.

Для dBase - это все не работает.

Ой не знаю. Проблема скорее всего не решится, если база будет размещена
у одного из клиентов и к ней будет осуществляться совместный доступ.
Право главного или "последнего" остается у клиента у которого непосредственно расположены базы. Жалко нет денег на отдельную машину...
...
Рейтинг: 0 / 0
26.01.2005, 11:18
    #32884021
_Sania
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Не совсем так, BDE пишет в свой спец. файл - PDOXUSRS.NET информацию о доступе клиентов и все нормальные клиенты BDE пользуются этой информацией и не мешают друг-другу.
Для реализации этого и служит параметр net dir - что бы все клиенты использовали один файл доступа.
...
Рейтинг: 0 / 0
26.01.2005, 11:39
    #32884093
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Но NET DIR нет в dBASE, эта фишка только в PARADOX ...
...
Рейтинг: 0 / 0
26.01.2005, 14:28
    #32884794
_Sania
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
_Sania
Решился перейти на Paradox?
Наиболее критичны два первых совета (они есть в любом приличном руководстве по local BDE), которые про local share и net dir, остальное - только улучшения, в принципе будет работать и так.

Для dBase - это все не работает.


dBase - не сетевая БД, это вобще не БД, а файлы ОС специального формата.
...
Рейтинг: 0 / 0
26.01.2005, 17:18
    #32885398
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
[/quot]

dBase - не сетевая БД, это вобще не БД, а файлы ОС специального формата.[/quot]

Ха-ха-ха ...

Раньше я использовал технологию DataBase-Table-DataSource-DBGrid ,
а сейчас Session-DataBase-Table-DataSource-DBGrid . После
ручной настройки Session всё заработало, как и положено.

Есть только одна проблема это autorefresh данных у других клиентов не
происходит. Приходится по таймеру обновлять таблицу. Может есть другой
способ "обновить" данные?
...
Рейтинг: 0 / 0
26.01.2005, 17:31
    #32885434
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
с локальной (где база сидит) посылай месагу остальным ;) вот и рефрешится будеть ..
...
Рейтинг: 0 / 0
26.01.2005, 17:54
    #32885511
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
Нашел спеца по месегам. Ты имеешь ввиду что-то типа
авторPostMessage(Handle, WM_UPDATETABLE, 0, 0)
возможно я и ошибаюсь. Короче как это сделать???
...
Рейтинг: 0 / 0
27.01.2005, 07:53
    #32886061
Guest?
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
имею на виду компоненты
NMMSGServ и NMMsg
первый сервер принятия мессаг и второе клиент для принятия ;)
но можно еще и по другим способам передавать команду .. тебе же намек там (даже можно один символ ;)) передавать надо .. но если в будушем намерен передавать не мало команд .. желательно юзай эти .. на них в хелпе и экз. примеры есть .. (но свои неудобства будуть это точно)
...
Рейтинг: 0 / 0
27.01.2005, 12:12
    #32886671
SCORPION Z
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BDE и локальное размещение БД
1. Обновление данных я сделал по таймеру - так проще:
Код: plaintext
if ((Table1->Active)&&(Table1->State == dsBrowse)) Table1->Refresh();
2. авторВ настройках BDE:
LOCAL SHARE=TRUE
Все кто говорили об этом были правы! Не нужно добавлять к проекту ни
TDataBase ни TSession - эти проблемы решает BDE.
А вот LOCAL SHARE=TRUE действительно снимает все вопросы при
совместном доступе к БД. Тема закрыта!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / BDE и локальное размещение БД / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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