+-------------------< ssReader >-------------------+ | | | Модуль выполнения удаленных запросов | | к консолидирующим базам данных | | | |(на основе системы сеансовой синхронизации )| | | |--------------------------------------------------| | ssReader.dll | +--------------------------------------------------+ В удаленных сайтах распределенных систем часто возникает необходимость оперативного получения различной информации из консолидирующей базы данных. Если Вы используете систему сеансовой синхронизации , решение этой задачи становится весьма тривиальным. Используя модуль удаленных запросов ssReader.dll, Вы можете обеспечить свои приложения возможностью выполнения запросов к консолидирующей базе данных. Для этого необходимо наличие установленного в консолидирующей базе данных сервера синхронизации ssServer.exe (компонент системы ). В этом случае с помощью модуля удаленных запросов клиентские приложения могут выполнять запросы к консолидирующим базам данных и обрабатывать на клиентской стороне полученные наборы данных в соответствии с требованиями прикладной задачи. Используя технологию кратковременных соединений, модуль удаленных запросов -- устанавливает соединение с сервером синхронизации; -- передает ему текст SQL-запроса для выполнения в консолидирующей базе данных; -- получает результирующий набор данных; -- разрывает соединение с сервером синхронизации; -- передает полученный набор данных (TDataSet) в клиентское приложение для последующей обработки. -------------------------------------------------------------------------------- Модуль удаленных запросов выполнен в виде динамически подключаемой библиотеки ssReader.dll -------------------------------------------------------------------------------- ssReader.dll экспортирует следующие функции: -- Инициализация ssReader_Init -- Освобождение ресурсов, используемых ssReader_Done -- Функции открытия и закрытия соединения с сервером синхронизации ssReader_OpenConnection ssReader_CloseConnection -- Выполнение запроса ssReader_GetDataADODataSet ssReader_GetDataClientDataSet -- Функции для работы с настроечными параметрами соединения ssReader_ClearTunes ssReader_GetTunes ssReader_SetTunes ssReader_ReadTunes ssReader_WriteTunes ssReader_DialogTunes -- Вспомогательные функции ssReader_GetVersion ssReader_SetLanguage ssReader_InterceptCheck В модуле ssReaderIntf.pas дополнительно реализованы следующие функции: -- ssReader_LoadADODataSet -- ssReader_LoadClentDataSet -------------------------------------------------------------------------------- Ниже приведено описание интерфейсной части перечисленных функций, взятое из ssReaderIntf.pas. Там же Вы найдете описание всех необходимых типов данных. procedure ssReader_Init(AAddLogMethod: TAddLogMethod); StdCall; // Выделяет ресурсы необходимые для работы с ssServer.exe // procedure ssReader_Done; StdCall; // Освобождает ресурсы необходимые для работы с ssServer.exe // procedure ssReader_ClearTunes; StdCall; // Очищает настройки // procedure ssReader_GetTunes(var AData: TSSAgentDataTunes); StdCall; // Получает текущие настройки // procedure ssReader_SetTunes(const AData: TSSAgentDataTunes); StdCall; // Назначает настройки // procedure ssReader_ReadTunes; StdCall; // Читает настройки из файла ssReader.opt // Если файла нет, он создается // procedure ssReader_WriteTunes; StdCall; // Пишет настройки в файл ssReader.opt // Если файла нет, он создается // procedure ssReader_DialogTunes(const ACaption: string; ADoRasHangup: Boolean); StdCall; // Закрывает соединение с Базой Данных. // Закрывает соединение с ssServer.exe. // Вызывает диалог настроек. // Если нажали OK, пишет настройки в файл ssReader.opt. // Если файла нет, он создается. // Если используется модемное соединение и ADoRasHangup=True, модем положит трубку. // function ssReader_OpenConnection(const AGroupName: string): string; StdCall; // Открывает соединение с ssServer. // Открывает соединение с Базой Данных для группы приложений AGroupName. // Пользователь SQL-сервера должен быть "SSDATAREADER" иначе отказ. // Если OK, то вернет строку с информацией о соединении. // Если не OK, то вернет пустую строку. // Из соображений обеспечения безопасности SSDATAREADER не должен иметь прав на запись в БД. // procedure ssReader_CloseConnection(ADoRasHangup: Boolean); StdCall; // Закрывает соединение с Базой Данных. // Закрывает соединение с SSServer. // Если используется модемное соединение и ADoRasHangup=True, модем положит трубку. // function ssReader_GetVersion: Double; StdCall; // Возвращает номер версии . // function ssReader_InterceptCheck: Boolean; StdCall; // Проверяет установлена ли библиотека перехвата mssdiz.dll. // Если нет, устанавливает ее в C:\SS\mssdiz.dll и регистрирует. // function ssReader_GetDataADODataSet(const ACommandText: WideString; AFormat: Integer; var AData: OleVariant): Boolean; StdCall; // Выполняет запрос ACommandText // Результат запроса возвращается в AData // если AFormat = 0 AData содержит бинарные данные ADO Stream // если AFormat = 1 AData содержит данные ADO XML // Через эту функцию работает ssReader_LoadADODataSet. // function ssReader_GetDataClientDataSet(const ACommandText: WideString; AFormat: Integer; var AData: OleVariant): Boolean; StdCall; // Выполняет запрос ACommandText // Результат запроса возвращается в AData // если AFormat = 0 AData содержит бинарные данные ClientDataSet // если AFormat = 1 AData содержит данные ClientDataSet XML // Через эту функцию работает ssReader_LoadClentDataSet. // {$IFDEF USEADODATASET} function ssReader_LoadADODataSet(ADataSet: TCustomADODataSet; const ACommandText: WideString; AFormat: Integer): Boolean; // Открывает brief-case ("отвязанный") ADataSet // если AFormat = 0 в бинарном формате // если AFormat = 1 в формате XML {$ENDIF} // {$IFDEF USECLIENTDATASET} function ssReader_LoadClentDataSet(ADataSet: TClientDataSet; const ACommandText: WideString; AFormat: Integer): Boolean; // Открывает brief-case ("отвязанный") ADataSet // если AFormat = 0 в бинарном формате // если AFormat = 1 в формате XML {$ENDIF} -------------------------------------------------------------------------------- В комплект поставки входят исходные тексты приложения ssReaderDemo, которое демонстрирует применение всех перечисленных функций. Проект ssReaderDemo требует наличия ssReader.dll при запуске. -------------------------------------------------------------------------------- В реальных прикладных задачах мы рекомендуем использовать технологию кратковременных соединений. Ниже приводится пример использования такой технологии. -------------------------------------------------------------------------------- {$DEFINE USEADODATASET} // Выберите, что Вы будете использовать: {$DEFINE USECLIENTDATASET} // USEADODATASET или USECLIENTDATASET const AppGroupName: string = 'MyAppGroupName'; var DoRasHangup: Boolean = False; // не класть трубку модема {$IFDEF USEADODATASET} {$IFDEF USECLIENTDATASET} You must undefine USECLIENTDATASET {$ENDIF} MyQuery: ADODB.TCustomADODataSet = nil; // Используем ADODataSet {$ENDIF} {$IFDEF USECLIENTDATASET} {$IFDEF USEADODATASET} You must undefine USEADODATASET {$ENDIF} MyQuery: DBCLIENT.TClientDataSet = nil; // Используем ClientDataSet {$ENDIF} function DoMyRemoteQuery(AMyQueryOwner: TComponent; const ASqlText: WideString): Boolean; begin Result := False; if ssReader_OpenConnection(AppGroupName) = '' then begin ShowMessage('Невозможно установить соединение с ssServer'); Exit; end; try {$IFDEF USEADODATASET} ssReader_LoadADODataSet( MyQuery, // ADataSet: TCustomADODataSet; ASqlText, // const ACommandText: WideString; 0); // AFormat: Integer; {$ENDIF} {$IFDEF USECLIENTDATASET} ssReader_LoadClentDataSet( MyQuery, // ADataSet: TCustomADODataSet; ASqlText, // const ACommandText: WideString; 0); // AFormat: Integer; {$ENDIF} finally ssReader_CloseConnection(DoRasHangup); end; end; Вызов DoMyRemoteQuery: ---------------------- begin ... SomeSqlText := 'select * from MyTable'; ... if DoMyRemoteQuery(Application, SomeSqlText) then begin Здесь мы имеем "отвязанный" набор данных MyQuery. Показываем его на сетке или проводим иную его обработку. ... MyQuery.Close; end; ... end; ... initialization ssReader_Init(nil); // Выделяем ресурсы необходимые для работы ssReader finalization ssReader_Done; // Освобождаем ресурсы end. -------------------------------------------------------------------------------- Для работы требуется, чтобы в файле соединений ssDbCon.lst (в консолидирующей базе данных) присутствовала запись, с логином "ssDataReader". Создайте в консолидирующей базе данных такой логин и назначьте ему права на чтение к требуемым таблицам и представлениям. Если Вы используете MSSQL, можно сделать "ssDataReader" членом роли базы данных "db_datareader". Более подробно о файле соединений см. в sbss_BOL.chm. --------------------------------------------------------------------------------