|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Выполнение запроса на сервере
Пишу клиент-серверную БД. По локалке должна работать.
Клиент с сервером коннектится. Далее делаю следующее: Код:
ClientDataSet1.CommandText:='SELECT * FROM [Книжный фонд] WHERE [Автор книги]=''%Ку%'''; ClientDataSet1.Execute; ADOQuery1: Cannot perform this operation on an open dataset. Собственно вопрос: Какого датасета ему надо? И как правильно написать процедуру, чтобы сервер выполнил запрос? Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#2
|
||||
|
||||
select обычно через Open открывается.
Пишу программы за еду. __________________ |
#3
|
||||
|
||||
Цитата:
Я знаю, что в ADOQuery можно вписать запрос и выполнить его через ReOpen. Но ADOQuery у меня на серверной проге. А в клиентской - ClientDataSet, и согласно тому, что написано в учебнике, этот компонент может отсылать запросы на сервер, где они и будут выполняться. Это я и пытаюсь сделать. Написал: Код:
ClientDataSet1.Close; ClientDataSet1.Open; Вот параграф из учебника: Код:
Управление запросом на сервере Компонент 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
|
||||
|
||||
Как бы...
Код:
ClientDataSet1.CommandText:='SELECT * FROM [Книжный фонд] WHERE [Автор книги]=''%Ку%'''; ClientDataSet1.OPEN; Последний раз редактировалось Admin, Сегодня в 10:32. |
#5
|
||||
|
||||
Цитата:
И вот так писал: Код:
ClientDataSet1.Close; ClientDataSet1.CommandText:='SELECT * FROM [Книжный фонд] WHERE [Автор книги]=''%Ку%'''; ClientDataSet1.OPEN; Фишка в том, что сообщение об ошибке приходит не от ClientDataSet1, а от ADOQuery, расположенного на сервере. Именно он не может выполнить запрос. Вроде в серверной проге все свойства для DataSetProvider выставлены правильно... Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#6
|
||||
|
||||
Может быть, можно каким-то образом послать серверу команду закрыть, а потом открыть ADOQuery?
Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому |
#7
|
||||
|
||||
УРАААА!!!!
Решение проблемы оказалось ещё проще, чем я предполагал:
Всего-то нужно, чтобы при запуске серверного приложения у всех ADODataSet или ADOQuery свойство Active было выставлено в False. И никаких проблем. Если ты чего-то не знаешь, значит есть шанс научиться чему-то новому Последний раз редактировалось Klassenas, 17.04.2012 в 00:10. |