Сервер приложений должен поключаться к базе даних не в дизайне, а в рантайм при старте берёт данные из логфайла или реестра. К модулю RemoteDataModule доступа не будет, пока не создана переменная типа модуля (как форма). Но переменная делает копию модуля, клиент же работает с оригиналом... По этому при статре сервера (когда конектиться клиент) возникает ошибка — сервер не подключён к базе даных...
Если можете подсказать, — подскажите. Буду благодарен.
Здравствуйте, CooperUK.
Есть вариант: устанавливать соединение с БД хоть и после подключения клиента, но до его первого обращения к данным (или во время). Самое простое -- создать функцию регистрации клиента в интерфейсе вашего сервера. Эту функцию клиент будет вызывать клиентское приложение сразу после установки соединения с серверным. Примерно так:
Клиент устанавливает соединение:
try
...
ConnectionBroker.Open;
ConnectionBroker.AppServer.RegisterClient(LoginStr, PasswordStr);
...
except
...
raise;
end;
Где функция RegisterClient объявлена в интерфейсе сервра:
[
uuid(E97A5961-098C-11D7-B602-00609762EB02),
version(1.1),
helpstring("Dispatch interface for MyDCOMServer Object"),
dual,
oleautomation
]
interface IMyDCOMServer: IAppServer
{
HRESULT _stdcall RegisterClient([in] BSTR UserName, [in] BSTR UserPassword );
[
id(0x00000002)
]
...
};
В RemoteDataModule следующее:
...
interface
...
TMyRemoteDataModule = class(TRemoteDataModule, IElibEditorServer)
...
protected
...
procedure RegisterClient(const UserName, UserPassword: WideString); safecall;
...
end;
...
implementation
...
procedure TMyRemoteDataModule.RegisterClient(const UserName, UserPassword: WideString);
begin
... // Устанавливаем соединение с БД
end;
В общем-то, лучше было бы сделать не процедуру, а функцию, возвращающую код ошибки.
У меня, например, компонент соединения с сервером лежит в отдельном модуле и является общим для нескольких (или всех) клиентов. У каждого клиента в RemoteDataModule свои транзакции, а подключение компонента соединения происходит еще до появления первого клиента... Да, шевелится это все на InterBase.