9 / 9 / 4
Регистрация: 11.07.2012
Сообщений: 200
1

Ликбез по DataSnap

30.01.2015, 23:54. Показов 22355. Ответов 30
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всех приветствую,
предлагаю открыть дисскусию по теме технологии DataSnap (трехзвенка от создателей delphi)

интересна любая информация по данной технологии
(в идеале ссылку на рабочий проект - только не такой ,как в папке sampels, что в комплекте с delphi
в котором во первых черт ногу сломит, во вторых того что нужно все равно нет, а сделанный самостоятельно )

Те кто пытался самостоятельно разобраться, по книгам и учебным примерам думаю меня поймут.

И так цель: есть одноранговая локальная сеть TCP/IP

1й Компьютер: (ОС Win7. Установлена Delphi XE7 Architect)

Лежит база firebird (2.5/3 диалект/win1251) в ней всего одна таблица - "clients"
Запущен сервер приложений datasnap - в качестве службы Windows.
На форме клиентского приложения VCL. есть таблица dbgrid и кнопки под ней

"Вставить" "Изменить" "Удалить" "Найти запись"

также присутствует кнопка "ПОДКЛЮЧИТСЯ/ОТКЛЮЧИТСЯ" и несколько Edit-ов
для внесения параметров (логин/пароль/ip адрес сервера приложений/порт/протокол)


2й Компьютер: ОС WinXP Только тонкий клиент (приложение VCL)
3й Компьютер: ОС Win7 Только тонкий клиент (приложение VCL)

Собственно просто хочу, чтобы это работало. Если бы на первом же "вэбинаре" эпизод 1 или, как там у них
показали бы "на пальцах популярно " такой или подобный проект, интерес вникать в эту рекламируемую
технологию дальше, был бы на много выше


А вот, что я выяснил за 2 недели исследований:

1. Самое главное, данный проект можно реализовать 2мя путями
"по старому" - DataSnap до delphi 2010 ( клиент на основе провайдера TDSProvidrConnection)
"по новому" - DataSnap delphi 2010, XE,XE2,........ (клиент на базе компонента TSqlServerMethod)

меня прежде всего интересует "по новому" ибо (цитирую Осипова ниже) (но и по старому интересно)

"Использование провайдеров наборов данных TDataSetProvider и TDSProviderConnection в проектах DataSnap
целесообразно лишь в том случае, когда клиентское приложение должно работать на основе интерфейса
IAppServer -т.е. для совместимости со старыми проектами зависимыми от COM .....................
Основное достоинство новой DataSnap — избавление от зависимости от COM, что позволило создавать более
простые и производитель-ные приложения"

не буду корчить из себя знатока - совершенно не представляю, что в итоге дает мне на практике
эта независимость от COM но я делаю проект с нуля и хочу, чтобы он был универсальным и актуальным.
Подозреваю, что будет легче "портировать" тонкий клиент на другие оси (не мелкософтные).

ТЕПЕРЬ В КРАТЦЕ:

по старому:

сервер Firebird - ТSQLconnection - ТSQLdataset - DataSetProvaider
- SQLquery


(причем у ТSQLdataset интересны 2 свойства это CommandType и Commandtext)
В CommandText передается инструкция SQL если в CommandType выбранно stQuery, но надо не
забыть поставить флаг poAllowCommandText в опциях.

клиент ТSQLconnection - DSProviderConnection - ClientDataSet1 - DataSource1 - DBGrid

(есть один нюанс клиент не будет работать если на компьютере с клиентом не зарегистрирована библиотека
midas.dll) Сразу вопрос, а если "по новому" - нужна эта midas.dll на клиенте? .. нет, а что нужно?

по новому:

сервер Firebird - ТSQLconnection - ТSQLdataset -SQLquery

клиент ТSQLconnection - SqlServerMethod - - DataSetProvaider - ClientDataSet1 - DataSource1 - DBGrid

(здесь все sql запросы передаются через параметры серверных методов - ниже есть пример)

(отступление) в посте (ISAPI, MySQL и DataSnap XE2. от 26/08/2012 Vlad 11 Комментарии Delphi в Web )

сказано цитирую:
"Теперь настроим TSQLServerMethod. Вообще, этот компонент удобно использовать в том случае,
если нам необходимо получить данные только для чтения. " и
"В приведенном выше примере клиента мы создали вот такую связь компонентов:
ТSQLconnection - SqlServerMethod - - DataSetProvaider - ClientDataSet1 - DataSource1 - DBGrid
Для чтения данных с сервера этого достаточно, для модификации — нет. Напишем теперь клиентское
приложение, которое будет и читать и модифицировать данные." Далее автор реализует вариант
"по старому" причем не с механизмом Commandtext, а с пресловутым dbnavigatorom, что есть не серьезно

Так вот - это не правда с помощью SqlServerMethod данные прекрасно редактируются.
Совсем другой вопрос, как в реальном времени обновлять данные в DBGrid не включая и не выключая
постоянно ТSQLconnection. Связь (TDSProvidrConnection-DataSetProvaider) сама рулила обновлением
данных (там и команда нужная имеется ApplyUpdate) достаточно было открыть/закрыть ClientDataSet1
рвать ТSQLconnection было не нужно.

Я добился конечно видимости - реальной работы с данными через тонкий клиент только при помощи
SqlServerMethod но что будет дальше если я захочу встроить например механизм транзакций ?
Не помешает постоянное отключение/включение ТSQLconnection ?

Так как я читал все подряд, то мой проект сначала получился комбинированным т.е на форме
присутствовали как компоненты - провайдеры так и SqlServerMethod и удивительное дело
все это вместе работало - а точнее "Вставить" "Изменить" "Удалить" работали через SqlServerMethod
в то время как DBGrid обнавляли провайдеры в тчении одного подключения ТSQLconnection

ЧТО Я НЕ СМОГ ПОБЕДИТЬ

1. "Найти запись" - я не смог передать sql запрос SELECT из клиента в сервер не "по старому " не "по новому"
Господин Осипов к величайшему сожалению показал только пример с Insert , по которому я и реализовал
Delet и Update. как правильно обновить ClientDataSet1 через метод - не понимаю
"по старому " через Commandtext не так интересно но тоже пока не получается

2. Я не могу заставить работать клиент на машине где нет delphi, сервер - могу. Т.Е

1й Компьютер (клиент) ----------- 2й Компьютер (сервер) работает
1й Компьютер (клиент) ----------- 3й Компьютер (сервер) работает
1й Компьютер (сервер) ----------- 2й Компьютер (клиент) не работает
1й Компьютер (сервер) ----------- 3й Компьютер (клиент) не работает

Пишет мол Error Asess Violation xxxxxx Not READ adress 00000000000000 ну то есть имеется
попытка доступа к чемуто , что пока/или уже (nil)

3. Как правильно организовать процедуру самого подключения, особенно меня интереует запрос
имени и пароля

Delphi
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
   if DataModule2.SQLConnection1.Connected then
   begin
      //Закрыть соединение
      DataModule2.ClientDataSet1.Close;
      DataModule2.SQLConnection1.Close;
      BConnect.Caption:='Подключиться';
      ComboBoxSetIP.Enabled:=True;
      ComboBoxSetIP.Color:=clWindow;
      ComboBoxSetProtocol.Enabled:=True;
      ComboBoxSetProtocol.Color:=clWindow;
      ELogin.Enabled:=True;
      ELogin.Color:=clWindow;
      EPass.Enabled:=True;
      EPass.Color:=clWindow;
      EPort.Enabled:=True;
      EPort.Color:=clWindow;
   end
         else
   begin
      //устанавливаем параметры подключения
      with DataModule2.SQLConnection1 do
      begin
      //Params.Values['DriverUnit']:= 'Data.DBXDataSnap';
      Params.Values['CommunicationProtocol']:= ComboBoxSetProtocol.Text;
      Params.Values['HostName']:= ComboBoxSetIP.Text;
      Params.Values['Port']:= EPort.Text;
      //Params.Values['DatasnapContext']:= 'datasnap/';
      //Params.Values['Password']:= EPass.Text;
      //имя пользователя
      //Params.Values['DSAuthUser']:=ELogin.Text;
      //пароль
      //Params.Values['DSAuthPassword']:=EPass.Text;
      //пробуем подключиться
      //Params.SaveToFile('C:\1.txt');
      Open;
      end;
 
      Label2.Caption:=DataModule2.SQLConnection1.Params.Values['HostName'];
 
      if DataModule2.SQLConnection1.Connected then
      begin
      DataModule2.ClientDataSet1.Open;
      BConnect.Caption:='Отключиться';
      ComboBoxSetIP.Enabled:=False;
      ComboBoxSetIP.Color:=clSilver;
      ComboBoxSetProtocol.Enabled:=False;
      ComboBoxSetProtocol.Color:=clSilver;
      ELogin.Enabled:=False;
      ELogin.Color:=clSilver;
      EPass.Enabled:=False;
      EPass.Color:=clSilver;
      EPort.Enabled:=False;
      EPort.Color:=clSilver;
      end;
   end;
то что авторизацию можно сделать либо на уровне СУБД либо на уровне datasnap я смутно представляю
мне интересен вариант - datasnap
но когда я делаю свойство ТSQLconnection Loginpromt - True то выскакивает окошко, а как сделать
в своей форме ?
и еще один момент, реакцию на вводимые данные в edit по портам, протоколам, ip я наблюдаю но
если клиент и сервер на одной машине (где делфи) то даже если данные не вводить то все равно
таблица открывается, где я только не вычищал из инспектора данные по умолчанию безполезно
клиент все равно их находит - этот момент меня напрягает

Вот на всякий случай кому интересно, листинг сервера и клиента:
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2015, 23:54
Ответы с готовыми решениями:

Делегаты. Ликбез
Объясните пожалуйста или посоветуйте какие нибудь источники объясняющие что такое делегаты, как и с...

Ликбез по ООП
Доброго времени суток! Друзья, подскажите, пожалуйста новичку. Чем руководствоваться при создании...

Требуется ЛикБез ^,.,^
Лирическое отступление (кому неинтересно может пропустить): сломался калькулятор, починке он...

Qthread (ликбез)
Задача: 20 детей едят из одной миски, в которой 100 слив, когда ребенок хочет кушать, он берёт из...

30
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
04.09.2015, 17:08 21
Author24 — интернет-сервис помощи студентам
PiNorDim, привет, короче с базовыми операциями я разобрался, все летает, а вот картинки грузить - трабл... - метод ApplyUpdates - не работает. То есть, в закешированных элементах (Simpledataset, ClientDataSet) отображается загрузка картинки, а вот в реальной базе MySQL EmtyDataSet (((
kebot, я видел в соседней ветке ты мучался с загрузкой картинок - домучал в итоге?
0
1 / 1 / 4
Регистрация: 09.09.2013
Сообщений: 112
10.05.2018, 13:48 22
Цитата Сообщение от GringoV Посмотреть сообщение
Короче,kebot, решение нашёл - не знаю насколько оно грамотное, но, блин, работает))) Возможно, это огород, но чего-то лучшего не нашел.
Ошибка была в том, что пытался изменить запрос на открытом множестве и как-то надо было его закрыть. Ладно, думаю, сделаю это в ручную...
-создал методы закрытия / открытия множества на сервере
-создал переменную серверного типа на клиенте
-вызвал методы с клиента для закрытия множества на сервере
Итого - как сделать Select в технологии DataSnap? (Ну и не только select, а все запросы к БД - update, delete и т.д... )
Кто-нибудь разобрался с этим ClientDataSet? Прошерстив инет вдоль и поперек, так и не нашел решения.
0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
10.05.2018, 14:09 23
Привет, сформулируй свою задачу
0
1 / 1 / 4
Регистрация: 09.09.2013
Сообщений: 112
11.05.2018, 10:44 24
Цитата Сообщение от GringoV Посмотреть сообщение
Привет, сформулируй свою задачу
Нужно с клиента передать запрос серверу, делаю через ClientDataSet, но получаю ошибку открытого набора данных. Решение нашел только то, которое выше опубликовано. Но может быть кто-нибудь обошел эту проблему?!

Добавлено через 6 часов 3 минуты
Есть ли у кого книга Боба Сворта "Delphi 2010 DataSnap: новые возможности в управлении и доступе к данным"? Не могу найти, ссылки не рабочие.
0
5778 / 4521 / 1430
Регистрация: 14.04.2014
Сообщений: 20,143
Записей в блоге: 20
11.05.2018, 15:44 25
что значит передать запрос?
запрос это просто строка. вы строку на сервер передать не можете?
ответ получать можно в чем угодно, можно и автоматом в Clientdataset
но современные тенденции программирования как бы намекают, что можно и без датасетов, простыми JSON обходиться
весь WEB обходится, и вы справитесь )))
0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
14.05.2018, 10:37 26
kaz4640984, привет! На днях собираюсь обновить свои знания по Datasnap, если вопрос ещё актуален, думаю смогу тебе помочь. Маякни здесь - актуально ещё или нет.
С уважением,
0
1 / 1 / 4
Регистрация: 09.09.2013
Сообщений: 112
15.05.2018, 10:06 27
GringoV, привет! С этой проблемой разобрался. Сейчас пытаюсь уменьшить Connection Timeout, при неправильном хосте выдает дефолтные 20-25 секунд.Пытаюсь решить, но пока безрезультатно!
0
5778 / 4521 / 1430
Регистрация: 14.04.2014
Сообщений: 20,143
Записей в блоге: 20
15.05.2018, 10:22 28
да. это есть. таймауты игнорятся
у меня только одна мысль.
вынести сам коннект в поток и прекращать его ждать через нужный нам таймаут
он конечно потом отвалится и все такое, но это уже просто игнорить
0
1 / 1 / 4
Регистрация: 09.09.2013
Сообщений: 112
05.06.2018, 11:34 29
Всем привет!) Долго меня не было!
Очередной трабл, который не могу сам решить.
В общем есть сервер к которому подключаются клиенты. Клиенты отправляют отчет на сервак. Все хорошо работает и работало, пока не добавил сворачивание в tray. Как только сверну в tray, клиент получает ошибку от БД (SQLite) "The database file is locked". Если не сворачивать в tray, то работает без ошибок. Есть у кого какие идейки по этому поводу?
0
5778 / 4521 / 1430
Регистрация: 14.04.2014
Сообщений: 20,143
Записей в блоге: 20
06.03.2023, 10:52 30
Прекрасно.
Единственное замечание, что в современных реалиях лучше исходники не паковать в архив и хранить непонятно где, а разместить например на GitHub.
То же и с доками.
Так доступ к ним будет гораздо шире.
1
7 / 5 / 0
Регистрация: 08.05.2009
Сообщений: 48
07.03.2023, 09:35 31
Спасибо
0
07.03.2023, 09:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2023, 09:35
Помогаю со студенческими работами здесь

Ликбез по ТВ и apple tv
Привет, у меня несколько вопросов, которые могут показаться глупыми, но если вы развеете мои...

DataSnap и БД
Добрый день! Кто нить работал с DataSnap и БД, Нашел статью как работать и пример, сервер...

Ликбез по стеку прошу
На скрине 1 пример с известного сайта. Из того куда указывает SP заключаю, что в качестве значения...

ликбез по оконным приложениям
Здравствуйте! Вот и подходит дедлайн по курсачу, а проект застрял на стадии "создал папку курсач"...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru