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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2017, 09:32   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
Вопрос Параметр в SELECT в хранимой процедуре в MS SQL

Добрый день!
Да, казалось бы, простой вопрос.
Создаю динамически ADOStoreProcedure и передаю ему имя процедуры так:
Код:
var
 ADS: TStoreProcedure;
begin
 ADS:=TStoreProcedure.Create(Form1);
 ADS.Connection:=ADOConnection1;
 DataSource1.DataSet:=ADS; //настраиваю датасет на мой ADS
 with ADS do
 begin
  ProcedureName:='[dbo].[GetAll]';
  Parameters.Refresh;
  Parameters.ParamValues[@Id]:=ParentId;
  ExecProc;
  Refresh;
 end;
 ADS.Free;
end;
Но, получается, что если писать после выполнения процедуры Refresh, то появляется сообщение, что "Can not perform operation on closed dataset" (текст сообщения писал на память, но, смысл такой).
При этом если не писать Refresh после выполнения процедуры, то в DBGridEh'е не отображаются записи! Но, я знаю точно, что такой же запрос на самом сервере через админку показывает прекрасно записи.
Прошу помощи. Учусь работать с хранимыми процедурами, пусть и методом проб и ошибок
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.06.2017, 09:57   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А что за тип TStoreProcedure? Там же TADOStoredProc. Впрочем не важно. Хранимку, возвращающую набор данных можно через ADOQuery вызывать. В sql - EXEC GetAll :Id. И Open или Active:=True. А в твоем типе скорее всего не ExecProc выполнять, а Open для возврата набора данных
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.06.2017 в 10:00.
Аватар вне форума Ответить с цитированием
Старый 13.06.2017, 10:26   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А что за тип TStoreProcedure? Там же TADOStoredProc. Впрочем не важно. Хранимку, возвращающую набор данных можно через ADOQuery вызывать. В sql - EXEC GetAll :Id. И Open или Active:=True. А в твоем типе скорее всего не ExecProc выполнять, а Open для возврата набора данных
Да, на счет TStoreProcedure, понятно, опечатался.
Мне нужно потом через DBNavigator удалять добавленные записи. То, что будет ADOQuery не страшно ведь? Ведь работа ведется с дата сетом.
А разве при использовании ХП можно вместо ExecProc использовать Open?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.06.2017, 10:58   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
А разве при использовании ХП можно вместо ExecProc использовать Open?
Это предположение, я этот компонент не использовал. А что мешает проверить?
Цитата:
Мне нужно потом через DBNavigator удалять добавленные записи. То, что будет ADOQuery не страшно ведь?
Это нормально, но сама возможность такого удаления зависит от настройки соединения
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.06.2017 в 11:01.
Аватар вне форума Ответить с цитированием
Старый 13.06.2017, 11:01   #5
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Это предположение, я этот компонент не использовал. А что мешает проверить?
Аватар! Красавчик! Спасибо! Open решило проблему
А в чем разница такая? Можешь пояснить почему ExecProc не работает в данном случае как работает Open?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.06.2017, 11:06   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

ExecProc работает так же, как ADOQuery.ExecSQL - просто выполняется чего-то без возврата набора данных. А Open возвращает, из хранимки в частности результат SELECT-а
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.06.2017, 11:16   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
ExecProc работает так же, как ADOQuery.ExecSQL - просто выполняется чего-то без возврата набора данных. А Open возвращает, из хранимки в частности результат SELECT-а
Супер!
Теперь понял разницу очень важную! Спасибо еще раз!
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.06.2017, 12:43   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
А в чем разница такая? Можешь пояснить почему ExecProc не работает в данном случае как работает Open?
Open работает в ADOStoreProc в тех случаях, когда результат работы хранимки -
какая-то выборка. И она по умолчанию закрыта, так как Exec при своём выполнении её только формирует.

Если возвращается скалярное значение - его забираем в OUTPUT-параметрах
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 13.06.2017, 17:04   #9
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,194
По умолчанию

Да-да!
Я теперь уловил разницу и что когда применять!
У меня немного другой вопрос по теме!
А как указать из какой таблицы брать данные?
Админка не пропускает выполнение такой ХП:
Код:
CREATE PROCEDURE [dbo].[GetFieldsByDirectori] 
	-- Add the parameters for the stored procedure here
	@MaxId int,
	@DirName varchar(255)
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	SELECT * FROM @DirName WHERE F_DIRECTORY = @MaxId
END
GO
Мне надо вместо @DirName подставлять имя таблицы.
Не говорите, что можно было через запрос. Да, можно было. Но, сегодня надо все выбрать из таблицы, а завтра понадобится некоторые поля и не хочу перекомпилировать приложение.
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 13.06.2017, 17:13   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Мне надо вместо @DirName подставлять имя таблицы.
Динамический запрос или "переменная @Tablename"
Цитата:
Наверное, одним из первых вопросов, возникающих у начинающих программистов на T-SQL, это вопрос "А как получить выборку из таблицы, имя которой занесено в переменную ?"

Т.к. в T-SQL нет возможности использовать в некоторых частях запроса значения переменных, то единственным доступным решением является использование динамического запроса. Идея очень проста: в специально определнной переменной "собирается" строка запроса, которая должна выполняться. Далее эта строка запускается на выполнение. Запуск можно осуществить двумя способами
- с помощью команды EXECUTE
- с помощью системной процедуры sp_executesql.

Выглядит это приблизительно так
Код:
DECLARE @SQL varchar(8000), @table_name varchar(10)
SET @SQL = 'SELECT * FROM ' + @table_name

exec(@SQL)
--или

exec sp_executesql @SQL

личная ремарка.
Цитата:
Сообщение от artemavd Посмотреть сообщение
Но, сегодня надо все выбрать из таблицы, а завтра понадобится некоторые поля и не хочу перекомпилировать приложение.
имхо, зря Вы это. универсального ничего не бывает, да и платить за эту гибкость придётся...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметров в хранимой процедуре Maxjuvefan БД в Delphi 7 17.09.2015 14:09
Как зделать запрос в хранимой процедуре xatabich БД в Delphi 8 08.12.2014 08:08
Имена переменных в хранимой процедуре Muramidaza БД в Delphi 0 17.03.2014 22:44
Insert or Update в хранимой процедуре Dozent SQL, базы данных 4 15.10.2013 03:17
как отключить соединения с БД в хранимой процедуре Neymexa SQL, базы данных 0 06.04.2010 11:44