Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Еще раз про выполнение Хранимых процедур (число прочтений - 2558 )
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Еще раз про выполнение Хранимых процедур
28. Января 2011 :: 12:56
Печать  
Объясните, пожалуйста, как всё-таки правильно выполнять хранимый процедуры MS SQL Server (в данном случае 2008)
Есть ХП:
Код
Выбрать все
ALTER PROCEDURE [dbo].[p_AgetsUpdateRows]
	@id char(9),
	@name char(100),
	@code char(10),
	@parent char(9) = NULL
AS
BEGIN
	SET NOCOUNT ON;
	if @parent = '     0   ' begin SET @parent = null end

    UPDATE dbo.Agents
    SET Name = @name, Code = @code, Parent = @parent   where ID = @id

    if @@ROWCOUNT = 0
    begin
		insert into dbo.Agents (ID, Code, Name, Parent)
		values (@id, @code, @name, @parent)
	end
END 


Выполняю в 1С:
Код
Выбрать все
зАгент = НовыйЗапрос();//обновление агентов
	зАгент.ДобПараметр(1, 14,9,0);
	зАгент.ДобПараметр(1, 14,100,0);
	зАгент.ДобПараметр(1, 14,10,0);
	зАгент.ДобПараметр(1, 14,9,0);
	зАгент.Подготовить("{call p_AgetsUpdateRows (?,?,?,?)}");
//---
зАгент.УстПараметр(1, вхАгент);
зАгент.УстПараметр(2, вхАгент.Наименование);
зАгент.УстПараметр(3, вхАгент.Код);
зАгент.УстПараметр(4, вхАгент.Родитель);
 


Так работает, но есть много неудобств:
1. При добавлении параметров методом "ДобПараметр" надо постоянно прыгать из окна 1С в Студию МС
2. При установке параметров методом "УстПараметр" надо обязательно смотреть что означал параметр под номером 1, 2... - т.е. опять прыгать
3. В 1sqlite, например, можно задавать именованые параметры:
Цитата:
SQL параметры это параметры для параметризированного запроса. В тексте запроса они обозначаются следующими способами:

? - неименованный параметр, установка возможна только по индексу.
?Число - неименованный параметр, установка возможна по индексу Число.
$ИмяПараметра или @ИмяПараметра - именованный параметр, установка возможна по имени.

в документации к ODBCRecordset я такого не нашел.


самый удобный способ, как мне кажется, такой:
Код
Выбрать все
ТекстЗапроса = "
	|EXEC	[dbo].[p_AgetsUpdateRows]
	|@id = :Агент,
	|@name = :Наименование,
	|@code = :Код,
	|@Parent = :Родитель";
	Запрос.УстановитьТекстовыйПараметр("Агент", вхАгент);
	Запрос.УстановитьТекстовыйПараметр("Наименование", вхАгент.Наименование);
	Запрос.УстановитьТекстовыйПараметр("Код", вхАгент.Код);
	Запрос.УстановитьТекстовыйПараметр("Родитель", вхАгент.Родитель);
	//Запрос.Отладка(1);
	Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
		Сообщить("Не удалось вставить агента: "+вхАгент+" по причине:","!");
		Сообщить(Запрос.ПолучитьОписаниеОшибки(),"!");
		Возврат 0;
	КонецЕсли; 


Но таким способом можно задавать только текстовые значения. Опять-таки в 1sqlite намного удобнее. Там вместо "УстановитьТекстовыйПараметр" есть метод "Подставлять", который именно ПОДСТАВЛЯЕТ заданное значение в параметр, а не передает его как текст. upd Извиняюсь, был неправ.

Уважаемые знатоки, подскажите как делаете вы. И что я пропустил при изучении данного вопроса.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Еще раз про выполнение Хранимых процедур
Ответ #1 - 28. Января 2011 :: 13:06
Печать  
JohnyDeath, ты таки переполз на SQL?  Подмигивание Поздравляю!
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #2 - 28. Января 2011 :: 13:15
Печать  
Нет, не перелез. Это я поставил SQLExpress и играюсь.
Сейчас уже есть логгирование изменений реквизитов документов, реализованные через перехватчик и внешней СУБД SQLExpress.
Давно хочу некоторую аналитику, наиболее интересную руководителям и менеджерам, вести параллельно в СУБД SQLExpress + к этому прикрутить analysis services.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Еще раз про выполнение Хранимых процедур
Ответ #3 - 28. Января 2011 :: 13:23
Печать  
JohnyDeath писал(а) 28. Января 2011 :: 13:15:
Это я поставил SQLExpress и играюсь.


Хорошее дело...вместо ДобПараметр можно использовать "ПостроитьПараметры"
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #4 - 28. Января 2011 :: 13:31
Печать  
Я как-то уже с ним пробовал работать, но он постоянно косячил и приходилось самому руками делать ДобПараметр. Теперь даже не пробую.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #5 - 28. Января 2011 :: 13:43
Печать  
Насчет неправильной работы метода "УстановитьТекстовыйПараметр" был неправ.

Натыкался на такую проблему в OLEDB (вроде бы). Почему-то сегодня подумал, что это для ODBCRecordSet. Извиняюсь.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #6 - 28. Января 2011 :: 13:45
Печать  
(0) Что то очень сложно
Я делаю так

Код
Выбрать все
СтрЗапроса = "EXEC [dbo].[p_AgetsUpdateRows]  'Зн_стр1', 'Зн_стр2', 'Зн_стр3', 'Зн_стр4'";
ТЗ = rc.ВыполнитьИнструкцию(СтрЗапроса);
 

  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #7 - 28. Января 2011 :: 13:48
Печать  
Z1 писал(а) 28. Января 2011 :: 13:45:
(0) Что то очень сложно
Я делаю так

Код
Выбрать все
СтрЗапроса = "EXEC [dbo].[p_AgetsUpdateRows]  'Зн_стр1', 'Зн_стр2', 'Зн_стр3', 'Зн_стр4'";
ТЗ = rc.ВыполнитьИнструкцию(СтрЗапроса);
 


Ну примерно как делаю я сейчас. правда у тебя в ХП таким способом могут передаваться только char/varchar...
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #8 - 28. Января 2011 :: 13:53
Печать  
JohnyDeath писал(а) 28. Января 2011 :: 13:48:
Z1 писал(а) 28. Января 2011 :: 13:45:
(0) Что то очень сложно
Я делаю так

Код
Выбрать все
СтрЗапроса = "EXEC [dbo].[p_AgetsUpdateRows]  'Зн_стр1', 'Зн_стр2', 'Зн_стр3', 'Зн_стр4'";
ТЗ = rc.ВыполнитьИнструкцию(СтрЗапроса);
 


Ну примерно как делаю я сейчас. правда у тебя в ХП таким способом могут передаваться только char/varchar...

не совсем
метод выполнить считается устаревшим и лучше его не использовать особенно в новом коде.

Цитата:
таким способом могут передаваться только char/varchar...

Почему типы должны использоваться какие указаны в определении хп
например если первый и третий параметр int то

СтрЗапроса = "EXEC [dbo].[p_123]  10,'Зн_стр2', 30";


УстановитьТекстовыйПараметр удобно использовать когда передаем id 1c объектов.




  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #9 - 28. Января 2011 :: 13:59
Печать  
JohnyDeath писал(а) 28. Января 2011 :: 12:56:
Так работает, но есть много неудобств:

Зато так можно получать значения output параметров.  Улыбка
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #10 - 28. Января 2011 :: 14:00
Печать  
Про то что "выполнить" считается устаревшим не знал. В документации написано только про метод "ПолучитьРезультатыВ_ТЗ".
Я использовал метод Выполнить вместо метода ВыполнитьИнструкцию только потому, что первый не вызывает исключений при неправильной отработке сервером.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #11 - 28. Января 2011 :: 14:03
Печать  
berezdetsky писал(а) 28. Января 2011 :: 13:59:
JohnyDeath писал(а) 28. Января 2011 :: 12:56:
Так работает, но есть много неудобств:

Зато так можно получать значения output параметров.  Улыбка

Иван, вот скажи честно, ты вот так и добавляешь параметры, прыгая между окном Студии SQL, Конфигуратором и справкой по 1С++, чтобы соответственно посмотреть тип параметра и определить с помощью справки заветную циферку, которую нужно ставить в ДобПараметр(IOType, nSQLType, nLen, nDec, [pname])?

Кстати, если указывать именованый параметр [pname], то ничего далее не работает.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #12 - 28. Января 2011 :: 14:10
Печать  
Я обычно не использую в одной процедуре все возможные типы Смех , а запомнить несколько параметров не так уж и сложно. Т.е. прыгать между окнами не приходится.

Про pname ничего не скажу - не использую.
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Еще раз про выполнение Хранимых процедур
Ответ #13 - 28. Января 2011 :: 14:14
Печать  
berezdetsky писал(а) 28. Января 2011 :: 13:59:
JohnyDeath писал(а) 28. Января 2011 :: 12:56:
Так работает, но есть много неудобств:

Зато так можно получать значения output параметров.  Улыбка

Для моих задач как-то не требовалось использовать выходные параметры.
лтбо хп ничего не возвращает либо результат в ТЗ.

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать