Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.04.2012, 14:37
Аватар для Klassenas
Klassenas Klassenas вне форума
Новичок
 
Регистрация: 25.05.2009
Адрес: Казахстан, Павлодар
Сообщения: 87
Версия Delphi: Rad Studio 2010
Репутация: 1570
По умолчанию Выполнение запроса на сервере

Пишу клиент-серверную БД. По локалке должна работать.
Клиент с сервером коннектится.
Далее делаю следующее:
Код:
1
2
ClientDataSet1.CommandText:='SELECT * FROM [Книжный фонд] WHERE [Автор книги]=''%Ку%''';
ClientDataSet1.Execute;
В ответ на этот запрос вылезает сообщение:
ADOQuery1: Cannot perform this operation on an open dataset.

Собственно вопрос: Какого датасета ему надо? И как правильно написать процедуру, чтобы сервер выполнил запрос?
__________________
Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому
Ответить с цитированием
  #2  
Старый 13.04.2012, 14:40
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

select обычно через Open открывается.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 13.04.2012, 17:09
Аватар для Klassenas
Klassenas Klassenas вне форума
Новичок
 
Регистрация: 25.05.2009
Адрес: Казахстан, Павлодар
Сообщения: 87
Версия Delphi: Rad Studio 2010
Репутация: 1570
По умолчанию

Цитата:
Сообщение от NumLock
select обычно через Open открывается.
Что-то я недоперепонял. Что конкретно имеется в виду?
Я знаю, что в ADOQuery можно вписать запрос и выполнить его через ReOpen. Но ADOQuery у меня на серверной проге.
А в клиентской - ClientDataSet, и согласно тому, что написано в учебнике, этот компонент может отсылать запросы на сервер, где они и будут выполняться. Это я и пытаюсь сделать.
Написал:
Код:
1
2
ClientDataSet1.Close;
ClientDataSet1.Open;
Он мне в ответ такую же ошибку выдаёт. Разницы нет.
Вот параграф из учебника:
Код:
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
Управление запросом на сервере
 
Компонент TdientDataSet может не только эффективно управлять своим набором данных, но и влиять на выполнение серверного компонента, с которым он связан через провайдер.
 
Свойство
 
property CornmandText: string;
 
содержит текст запроса SQL, имя таблицы или хранимой процедуры в зависимости от типа серверного компонента.
 
Изменив значение этого свойства на клиенте, можно, например, модифицировать запрос SQL на сервере. Но для этого в свойстве Options соответствующего компонента-провайдера TDataSetProvider должно быть установлено значение
 
poAliowCommandText := True;
 
Новое значение свойства CommandText отправляется на сервер только после открытия клиентского набора данных или выполнения метода
 
procedure Execute; virtual;
 
Для запросов или хранимых процедур можно задавать параметры, которые сохраняются в свойстве
 
property Params: TParams;
 
До выполнения запроса присваиваются значения входным параметрам. После выполнения хранимой процедуры в выходных параметрах размещаются полученные от сервера значения.
 
Обратите внимание, что при выполнении запросов или хранимых процедур может измениться порядок следования параметров. Поэтому обращаться к параметрам желательно по их именам. Например, так:
 
Editl.Text := ClientDataSet.Params .ParamByName('OutputParam') .AsString;
 
Для того чтобы получить текущие значения параметров компонента набора данных на сервере, достаточно использовать метод
 
procedure FetchParams;
 
Перед и после получения параметров от провайдера, клиентский набор данных вызывает методы-обработчики событий:
 
property BeforeGetParams: TRemoteEvent; 
 
property AfterGetParams: TRemoteEvent;

Это что, учебник неправильный или я тупой?
__________________
Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому
Ответить с цитированием
  #4  
Старый 13.04.2012, 18:27
Аватар для friz
friz friz вне форума
Местный
 
Регистрация: 04.04.2008
Адрес: Минск
Сообщения: 596
Версия Delphi: 2007 & JAVA EE
Репутация: 10670
По умолчанию

Как бы...
Код:
1
2
ClientDataSet1.CommandText:='SELECT * FROM [Книжный фонд] WHERE [Автор книги]=''%Ку%''';
  ClientDataSet1.OPEN;
__________________
Последний раз редактировалось Admin, Сегодня в 10:32.
Ответить с цитированием
  #5  
Старый 13.04.2012, 21:17
Аватар для Klassenas
Klassenas Klassenas вне форума
Новичок
 
Регистрация: 25.05.2009
Адрес: Казахстан, Павлодар
Сообщения: 87
Версия Delphi: Rad Studio 2010
Репутация: 1570
По умолчанию

Цитата:
Сообщение от friz
Как бы...
Код:
1
2
ClientDataSet1.CommandText:='SELECT * FROM [Книжный фонд] WHERE [Автор книги]=''%Ку%''';
  ClientDataSet1.OPEN;
Я так уже писал.
И вот так писал:
Код:
1
2
3
ClientDataSet1.Close;
ClientDataSet1.CommandText:='SELECT * FROM [Книжный фонд] WHERE [Автор книги]=''%Ку%''';
  ClientDataSet1.OPEN;
И всё равно та же чушь получается.
Фишка в том, что сообщение об ошибке приходит не от ClientDataSet1, а от ADOQuery, расположенного на сервере. Именно он не может выполнить запрос. Вроде в серверной проге все свойства для DataSetProvider выставлены правильно...
__________________
Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому
Ответить с цитированием
  #6  
Старый 13.04.2012, 21:54
Аватар для Klassenas
Klassenas Klassenas вне форума
Новичок
 
Регистрация: 25.05.2009
Адрес: Казахстан, Павлодар
Сообщения: 87
Версия Delphi: Rad Studio 2010
Репутация: 1570
По умолчанию

Может быть, можно каким-то образом послать серверу команду закрыть, а потом открыть ADOQuery?
__________________
Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому
Ответить с цитированием
  #7  
Старый 15.04.2012, 10:31
Аватар для Klassenas
Klassenas Klassenas вне форума
Новичок
 
Регистрация: 25.05.2009
Адрес: Казахстан, Павлодар
Сообщения: 87
Версия Delphi: Rad Studio 2010
Репутация: 1570
Хорошо УРАААА!!!!

Решение проблемы оказалось ещё проще, чем я предполагал:
Всего-то нужно, чтобы при запуске серверного приложения у всех ADODataSet или ADOQuery свойство Active было выставлено в False.
И никаких проблем.
__________________
Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому

Последний раз редактировалось Klassenas, 17.04.2012 в 00:10.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025