Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.09.2008, 15:11   #1
kiber0net0
Пользователь
 
Регистрация: 12.08.2008
Сообщений: 18
По умолчанию SQL-запрос для приложенией клиент-сервер

Есть приложение-сервер, которое работает с БД mySQL через ADO.

Хочу написать приложение клиент, которое через протокол TCP/IP будет работать с БД через мое приложение-сервер.


Реализовать отображение таблиц через ADOQuery уже заранее созданных на приложении-сервере у меня получается через DCOMConnection, DataSetProvider и ClientDataSet , а от отправить SQL - запрос из клиента для его вылолнения на сервере и получении результатов на клиенте не получается.

Впринцепе можно предусмотреть все нужные таблицы для клиента на сервер-приложении и не мучаться, но хотелось зделать через один-два компонента чтобы в случая изменения клиента не приходилось переустанавливать серверное приложение


Что можете посоветовать? Может есть лучшие способы связи клиент-сервер приложений?

За ранее спасибо за ответы.
kiber0net0 вне форума Ответить с цитированием
Старый 26.09.2008, 18:08   #2
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Если уж так сильно захотелось трех уровневое приложение, осваивайте web интерфейс. прочитайте что такое бизнес правила, сервер приложений, тонкий и толстый клиент. Web client - самый тонкий клиент. У вас есть одна существенная ошибка, от клиента логику не строят. Вся логика должна быть на сервере, или на SQL или на сервере приложений. Вы пишите, при изменении клиента - возможна переустановка сервера - Самая страшная инженерная ошибка. Сервер точно от клиента зависеть не должен.
Rik вне форума Ответить с цитированием
Старый 27.09.2008, 03:59   #3
kiber0net0
Пользователь
 
Регистрация: 12.08.2008
Сообщений: 18
По умолчанию

Я наверное не правильно обьяснил. Весь основной код обработки данных как раз на сервере, данные берутся из log файлов которые создаются автоматически, заносятся в БД и дополняются или редактируются(если необходимо) юзером через клиент.


Просто мне было интересно как получить данные через SQL-запрос через тонкий клиент, да можно настроить куче провайдерво для каждой таблицы, но помоему это только плутает, проще когда один провайдер и через него проходят SQL-запросы для отображения отсеянных клиентом данных (по крайней мере для меня).

Тему можно впринцепе закрыть, я разобрался.
Упустил из виду один пример который приводился в книге А.Сорокина "Delphi разработка баз данных" и помоему еще где-то виде, там очень подробно росказывается как считать количество юзерей подключенных в данный момент к серверу .

Все как всегда просто. Кто столкнется с такой проблемой - рецепт(для Delphi7):
I На приложении-сервере:
1) Через меню "File -> New -> Other... -> закладка "Multitier" -> выбираем "Remote Data Module" -> OK -> называем этот модуль в поле "CoClass Name";
2) В созданном модуле помешаем компонент TDataSetProvider(закладка "Data Access")
3) Настраиваем поле DataSet с компонентом TADOQuery или c чем вам удобней, главное чтоб было куда SQL-запрос задать
4) TADOQuery(или что там выбрали) соединяем с БД.
5) Через меню "viev -> Type Library" добавляем к нашему "Remote Data Module" новый метод.
6) На закладке "Parametrs" добавляем переменную типа "BSTR", в "modifier" оставляем "in", закрываем "Type Library".
7) Теперь в нашем модуле ищем процедуру с именем которым мы назвали созданный метод и вписываем туда что-то типа


procedure TThermoForm.Qur(const sqlQ: WideString);
begin
DMConn.QConnection.SQL.Text:=sqlQ;
end;


где "sqlQ"- наша переменная созданная в методе.

I На приложении-клиенте:

1) Соединяемся с нашим сервером через компонент TDCOMConnection(на закладке "DataSnap")
2) Связываем TClientDataSet(закладка "Data Access") c TDCOMConnection через поле "Remote Server" и указываем в поле "Provider Name" имя нашего TDataSetProvider установленного на сервере.
3) Компонент DataSource1 связываем с TClientDataSet, а сам DataSource1 с TDBGrid(или как сами хотите);
4) Создаем две кнопочки и пишем примерно такой код.



procedure TClient.SpeedButton1Click(Sender: TObject);
begin
ClientConnection.DCOMConnection1.Ap pServer.Qur('select * from MK');
ClientConnection.ClientDataSet1.Clo se;
ClientConnection.ClientDataSet1.Ope n;
end;

procedure TClient.SpeedButton2Click(Sender: TObject);
begin
ClientConnection.DCOMConnection1.Ap pServer.Qur('select * from TableIn');
ClientConnection.ClientDataSet1.Clo se;
ClientConnection.ClientDataSet1.Ope n;
end;



Ну в общем думаю все теперь понятно.



P.S. Я понимаю что это и имелось ввиду выше изложенными подсказами, но для человека который сталкивается с этим в первый раз, тоесть меня, это только натолкнуло на выше приведенный способ, поэтому прошу воздержяться от коментариев типа "Так я об этом и говорил", "Ясен пень..." и т.д. .


P.S. P.S. Надеюсь я не напрасно потратил пол часа на набор этого сообщения и это кому-нибудь пригодится

Всем удачи, и большое спасибо за ответы(вопрос был в нескольких форумах), они меня и натолкнули на такой ответ.



Rik если Вам не сложно не могли бы вы указать источники , где можно по подробней почитать или расказать на пальцах про бизнес правила, потому что в литературе про это вскользь упомянули, но без коментариев и примеров. Кстати меня смущает выше приведенный код, не может ли создаться такая ситуация когда два юзера начинают изменять SQL-запрос одновременно и тот кто последний получит нуный результат, а все остальные не верный, а результат последнего, или delphi как то прослеживает чтобы данное не повторялось!!!
kiber0net0 вне форума Ответить с цитированием
Старый 27.09.2008, 18:30   #4
Rik
Форумчанин
 
Аватар для Rik
 
Регистрация: 28.07.2007
Сообщений: 361
По умолчанию

Цитата:
Сообщение от kiber0net0 Посмотреть сообщение
Rik если Вам не сложно не могли бы вы указать источники , где можно по подробней почитать или расказать на пальцах про бизнес правила, потому что в литературе про это вскользь упомянули, но без коментариев и примеров.
На самом деле всё просто, тут главное понимать принцип. К любой базе данных предъявляются определенные требования, например уникальность значений определенных полей, или обеспечение ссылочной целостности между связанными таблицами. Та логика, которая обеспечивает выполнение этих требований, называется бизнес правилами. Бизнес правила могут быть на стороне клиента, в этом случае, клиент называется толстым. Для локальных баз, не поддерживающих ни хранимых процедур, ни триггеров, бизнес правилами, контролирующими правильность вводимых значений, может обеспечивать только клиент...
Для серверных СУБД, все бизнес правила, весь контроль за правильностью вводимых значений, могут быть вынесены на сервер в ввиде хранимых процедур, триггеров и др. Клиент работающий с такой базой, не содержащий в своем коде никаких бизнес правил, называется тонким.
Существуют и смешанные варианты.
Лучший вариант, конечно, вынесение бизнес правил на сервер, или на SQL или на сервер приложений. Как известно самый тонкий клиент это Web браузер, поэтому я и рекомендую для 3х уровневых архитектур Web интерфейс.
Существуют правила Кодда, которые характеризуют реляционные СУБД и правила нормализации таблиц. Если вы с этим незнакомы, поищите в интернете, должно быть, все эти правила тоже помогут с верной организацией бизнес правил.
Я впервые про Бизнес правила прочитал в книге Натальи Елмановой Borland C++ Builder 4, давным давно это было, не знаю издается ли сейчас что-либо, поэтому на счет литературы что посоветовать и не знаю...
Rik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сервер клиент Dr.zlo Работа с сетью в Delphi 13 15.06.2009 21:43
Клиент-сервер-клиент Кронос Работа с сетью в Delphi 3 24.08.2007 07:57
Клиент-Сервер snakesoft Работа с сетью в Delphi 8 20.07.2007 17:34
клиент сервер Oksana1988 Фриланс 3 10.04.2007 12:12
Клиент-сервер Scorpio Работа с сетью в Delphi 6 13.02.2007 22:57