![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Интерфейс взаимодейстия с базой
Piter © (2006-01-02 23:33:00)Нужна организовать для DLL-плагина к программе доступ к SQL-базе. База - Interbase, но это не так важно.
То есть, внутри программы понятно: TDatabase / TQuery - все ясно.
А вот как организовать интерфейс взаимодействия с плагином? Чтобы плагин мог выполнять SQL запросы и получать результаты? Может кто занимался подобным, имеет опыт?
Может что-то типа:
CreateRequest('SQL-выражение') - функция возвращает Handle некоего созданного объекта (ну там ноль в случае неудачи)
Потом всякие:
GetParam(Handle, 'ParamName', AsInteger)
А в конце работы нужно закрыть объект:
CloseRequest(Handle);
Соответственно, в программе Handle это может быть чисто физически просто адрес TQuery. При выполнении запроса CreateRequest создается объект TQuery, Handle возвращается плагину. При CloseRequest объект TQuery уничтожается.
TQuery вроде как потоко-безопасный.
Покритикуйте плиз данную схему и как по другому можно?
В данной схеме меня пока смущает частое создание/уничтожение объекта TQuery - при каждом запросе. С другой стороны, вроде ничего страшного, TDataBase один общий будет, так что по скорости проблем особо не должно быть.
Sergey Masloff (2006-01-03 10:00:00) [21]Еще можно, видимо, обмениваться ADO-шными рекордсетами но там больше придется писать в плане изменений данных. То есть не проблема заполнить рекордсет и отдать его клиенту а вот написать универсальный механизм записи результатов редактирования клиентом рекордсета в базу не так просто.
Именно если это должен быть универсальный механизм сложно так-то ничего сложного
Sergey Masloff (2006-01-03 08:39:00) [22]Сейчас в новых (D6 D7) MIDAS по-другому называется. DataSnap вроде.
Sergey Masloff (2006-01-03 08:29:00) [23]Ну я же дал направление поиска - MIDAS. Все уже давно реализовано. Провайдер посредник между датасетом в серверном модуле (Query там или StoredProcedure) и датасетом в клиентском модуле.
То есть схема работы такая:
1) У тебя появляется интерфейс потомок IAppServer в котором тебе придется добавить методы принимающие строку например с текстом SQL и возвращающие провайдер к которому можно подключить ClientDataSet
2) У тебя появляется плагин реализующий твой потомок IAppServer. ТО есть в нем появляется TREmoteDataModule и методы реализации твоего IAppServer. Базовое приложение (к которому подцепляются все плагины) будет использовать эту реализацию для предоставления ее остальным плагинам - клиентам. Кстати меняя этот "серверный" плагин можно допустим коннектится действительно не к IB а к ораклу или еще куда
3) Появляются плагины-клиенты. Им всем передается ссылка на IAppServer которую они дергают для заполнения данными своих TClientDataSet.
Естественно все это работает только если клиентские плагины дельфийские или C++Builder овские.
Так что вооружайся справкой и вперед. Ключевые слова multi-tiered database applications. Простейший пример MIDAS есть в каталоге DEMOS. Только там все рассчитано что клиент и сервер на разных машинах поэтому всякие доп. прослойки появляются тебе они не нужны. Просто нужно напрямую ссылки на IAppServer передавать а не парится со всякими SocketServer-ами наверное.
Если есть вопросы общего плана я ответить могу а вото подробности - врядли Delphi у меня нет проверить ничего не могу ;-)
Piter (2006-01-03 01:19:00) [24]Piter © (03.01.06 1:12) [5]
В Delphi это удобно сделано с помощью TQuery
ну точнее, наверное, сказать TDataSet, но опять же не суть важно, думаю проблема понятна...
Piter (2006-01-03 01:17:00) [25]Кстати, не исключая вариант, что это я тебя не понял, Сергей.
Тогда плиз поподробнее :)
Особенно про:
Sergey Masloff (02.01.06 23:57) [4]
создавать динамически TQuery и провайдера для него и отдавать ссылку на провайдер клиенту
что значит отдавать ссылку на провайдера? Что это такое?
Что может извлечь плагин, имея ссылку на провайдера. Да и что такое провайдер? :)
P.S. Думаю, и так понятно, что в базах я ламачок :)
Piter (2006-01-03 01:12:00) [26]Sergey Masloff (02.01.06 23:43) [3]
ты не понял. Программа - плагиновая.
Плагин может делать в принципе что ему захочется. Он, конечно, вправе использовать сам какие ему угодно базы данных. НО - зачем?
Хочется с помощью ядра программы предоставить доступ к нормальной базе данных. Более того, вполне возможно, что работа с базой будет осуществляться еще одним плагином. Хочешь - плагин для Interbase, хочешь - плагин для Access или MS SQl, да хоть Oracle.
Для других плагинов все это абсолютно прозрачно. Пусть они просто оперируют простыми SQL выражениями и получают наборы данных. А откуда взяты эти данные - плагин и не знает. Да хоть IB, хоть Oracle, хоть из текстовых файлов.
Проблема не в распараллелизации и подобном. Проблема в описании интерфейса взаимодействия плагина с базой, хранилищем данных.
В Delphi это удобно сделано с помощью TQuery, например. Верно же? Это некая стандартизация доступа к данным. НО. У меня .NET пока не планируется, поэтому действовать на уровне объектов нельзя - плагин может быть написан и на Delphi, и на C++, на чем угодно, что может вызывать WinApi функции и компилировать библиотеки DLL.
То есть, в программе то наверняка будет TDataBase, TQuery, но как предоставить данные плагину? В этом и проблема...
Уф, надеюсь внятно объяснил... Если что - спрашивай.
Sergey Masloff (2006-01-02 23:57:00) [27]Можно заюзать MIDAS.
Например что-то в таком роде:
1 модуль реализующий IAppServer. Он реализует соединение с БД
Можно сделать его универсальным то есть он будет получать SQL запрос в текстовом виде, создавать динамически TQuery и провайдера для него и отдавать ссылку на провайдер клиенту. А тот уже штатными средствами ClientDataSet будет работать с данными. Параметры можно передавать через OwnerData
Можно сделать несколько стандартных интерфейсов - выполнение произвольного SQL выполнение ХП и так далее. Интерфейс наследник IAppServer публикуется и используется всеми другими плагинами дла работы с базой.
Может конечно и изврат но может и нет. Я особо идею не обдумывал но реализовать так точно можно. И будет пусть и не тривиальное но использование довольно стандартной технологии.
Sergey Masloff (2006-01-02 23:43:00) [28]Непонятно зачем это. Да и клиентская библиотека InterBase все рвно в очередь построит все запросы, непараллельная она.
Плагины к разным базам обращаться будут чтоли?
Piter (2006-01-02 23:40:00) [29]Еще вот что смущает - GetParam же может возвращать разные типы: integer, float, string и т.д.
То есть, в общем случае он возвращает PByte какой-нибудь, а уж плагин должен разобраться на что это ссылка в соответствии с поданым запросом: AsInteger, AsString и т.д.
Или сделать отдельные функции:
GetIntegerParam(Handle, 'ParamName')
GetStringParam(Handle, 'ParamName')
и т.д.
Вот думаю - как лучше?
Piter (2006-01-02 23:37:00) [30]Ну а:
CreateRequest, GetParam, CloseRequest - соответственно, просто импортируемые плагином функции