Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/118: Рейтинг темы: голосов - 118, средняя оценка - 4.67
 Аватар для kebot
9 / 9 / 4
Регистрация: 11.07.2012
Сообщений: 200

Ликбез по DataSnap

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

Студворк — интернет-сервис помощи студентам
Всех приветствую,
предлагаю открыть дисскусию по теме технологии 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.01.2015, 23:54
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 6 часов 3 минуты
Есть ли у кого книга Боба Сворта "Delphi 2010 DataSnap: новые возможности в управлении и доступе к данным"? Не могу найти, ссылки не рабочие.
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
11.05.2018, 15:44
что значит передать запрос?
запрос это просто строка. вы строку на сервер передать не можете?
ответ получать можно в чем угодно, можно и автоматом в Clientdataset
но современные тенденции программирования как бы намекают, что можно и без датасетов, простыми JSON обходиться
весь WEB обходится, и вы справитесь )))
0
16 / 16 / 1
Регистрация: 29.11.2014
Сообщений: 227
14.05.2018, 10:37
kaz4640984, привет! На днях собираюсь обновить свои знания по Datasnap, если вопрос ещё актуален, думаю смогу тебе помочь. Маякни здесь - актуально ещё или нет.
С уважением,
0
1 / 1 / 4
Регистрация: 09.09.2013
Сообщений: 112
15.05.2018, 10:06
GringoV, привет! С этой проблемой разобрался. Сейчас пытаюсь уменьшить Connection Timeout, при неправильном хосте выдает дефолтные 20-25 секунд.Пытаюсь решить, но пока безрезультатно!
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
15.05.2018, 10:22
да. это есть. таймауты игнорятся
у меня только одна мысль.
вынести сам коннект в поток и прекращать его ждать через нужный нам таймаут
он конечно потом отвалится и все такое, но это уже просто игнорить
0
1 / 1 / 4
Регистрация: 09.09.2013
Сообщений: 112
05.06.2018, 11:34
Всем привет!) Долго меня не было!
Очередной трабл, который не могу сам решить.
В общем есть сервер к которому подключаются клиенты. Клиенты отправляют отчет на сервак. Все хорошо работает и работало, пока не добавил сворачивание в tray. Как только сверну в tray, клиент получает ошибку от БД (SQLite) "The database file is locked". Если не сворачивать в tray, то работает без ошибок. Есть у кого какие идейки по этому поводу?
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,686
Записей в блоге: 21
06.03.2023, 10:52
Прекрасно.
Единственное замечание, что в современных реалиях лучше исходники не паковать в архив и хранить непонятно где, а разместить например на GitHub.
То же и с доками.
Так доступ к ним будет гораздо шире.
1
7 / 5 / 0
Регистрация: 08.05.2009
Сообщений: 48
07.03.2023, 09:35
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.03.2023, 09:35

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
31
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru