Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) Параметризованный запрос возвращает неправильный (нулевой) результат (число прочтений - 5014 )
KotMurza
Junior Member
**
Отсутствует


1C++ user

Сообщений: 24
Местоположение: Киев
Зарегистрирован: 20. Января 2013
Пол: Мужской
Параметризованный запрос возвращает неправильный (нулевой) результат
11. Июля 2013 :: 13:28
Печать  
Внизу приведены тексты двух, с моей точки зрения, абсолютно одинаковых скалярных запросов. "Обычный" запрос работает правильно. Параметризованный запрос с переменными - нет.

Текст запроса, который выдает правильный результат - количество остатка по измерениям на дату:
Код
Выбрать все
	Запрос=СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	| SELECT Рег.КвоОстаток as Остаток
	| FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=:ТМЦ,(ТМЦ),(Кво)) as Рег";

	Запрос.УстановитьТекстовыйПараметр("Склад",	Склад);
	Запрос.УстановитьТекстовыйПараметр("ТМЦ",	ТМЦ);
	Запрос.УстановитьТекстовыйПараметр("НаДату",ТекущаяДата());
	Ок=Запрос.Подготовить(ТекстЗапроса);
	Остаток=Запрос.ВыполнитьСкалярный();
 



А этот запрос - параметризованный - всегда выдает "0".
Код
Выбрать все
	Запрос=СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	| SELECT Рег.КвоОстаток as Остаток
	| FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=@ТМЦ, (ТМЦ),(Кво)) as Рег";

	Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
	Запрос.УстановитьТекстовыйПараметр("НаДату",ТекущаяДата());
	Ок=Запрос.Подготовить(ТекстЗапроса);
	Запрос.ДобПараметр(1,14,9,0,"@ТМЦ");
	Запрос.УстПараметр(1, ТМЦ);
    	   Остаток=Запрос.ВыполнитьСкалярный(); 


Помогите разобраться в проблеме, пожалуйста.
« Последняя редакция: 16. Июля 2013 :: 16:05 - KotMurza »  
Наверх
IP записан
 
Satans Claws
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 721
Зарегистрирован: 29. Ноября 2010
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #1 - 12. Июля 2013 :: 05:19
Печать  
С именованными параметризированными запросами не сталкивался, всегда работал с порядковыми (а при необходимости именованных - декларировал в начале запроса переменные и заполнял их значения через параметры)

Попробуй вот так
Код
Выбрать все
Запрос=СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	| SELECT Рег.КвоОстаток as Остаток
	| FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=?, (ТМЦ),(Кво)) as Рег";

	Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
	Запрос.УстановитьТекстовыйПараметр("НаДату",ТекущаяДата());
	Ок=Запрос.Подготовить(ТекстЗапроса);
	Запрос.ДобПараметр(1,14,9,0);
	Запрос.УстПараметр(1, ТМЦ);
	Остаток=Запрос.ВыполнитьСкалярный();  


  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #2 - 12. Июля 2013 :: 05:24
Печать  
SQL параметры

SQL параметры это параметры для параметризированного запроса. В тексте запроса обозначаются символом "?" (символ подстановки).
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #3 - 12. Июля 2013 :: 05:59
Печать  
Я не знаю человека который бы умел в полной мере работать с именованными параметрами.
Я умею только так:

FROM $РегистрОстатки.Остатки(,,Склад=:Склад AND ТМЦ=?ТМЦ, (ТМЦ),(Кво)) as Рег";

Запрос.ДобПараметр(1,14,9,0,"ТМЦ");

но это не будет работать если ВТ развернется в (rg union ra)


Обычно делаю так:
declare @ТМЦ char(9) set @ТМЦ = ?
...
FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=@ТМЦ, (ТМЦ),(Кво)) as Рег";

Запрос.ДобПараметр(1,14,9,0);
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #4 - 12. Июля 2013 :: 06:08
Печать  
в исходниках прослеживается особая обработка и такого случая
Запрос.ДобПараметр(1,14,9,0,"@ТМЦ");
но скорее всего это как то связано только с вызовом ХП и указанием их именованных параметров
  

1&&2&&3
Наверх
 
IP записан
 
KotMurza
Junior Member
**
Отсутствует


1C++ user

Сообщений: 24
Местоположение: Киев
Зарегистрирован: 20. Января 2013
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #5 - 12. Июля 2013 :: 09:55
Печать  
Satans Claws писал(а) 12. Июля 2013 :: 05:19:
С именованными параметризированными запросами не сталкивался, всегда работал с порядковыми (а при необходимости именованных - декларировал в начале запроса переменные и заполнял их значения через параметры)

Попробуй вот так
Код
Выбрать все
Запрос=СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	| SELECT Рег.КвоОстаток as Остаток
	| FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=?, (ТМЦ),(Кво)) as Рег";

	Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
	Запрос.УстановитьТекстовыйПараметр("НаДату",ТекущаяДата());
	Ок=Запрос.Подготовить(ТекстЗапроса);
	Запрос.ДобПараметр(1,14,9,0);
	Запрос.УстПараметр(1, ТМЦ);
	Остаток=Запрос.ВыполнитьСкалярный();  




Так вообще не работает. Метод ВыполнитьСкалярный() выдает ошибку:
Код
Выбрать все
State 07002, native 0, message [Microsoft][ODBC SQL Server Driver]Неправильное поле COUNT или ошибка синтаксиса
 

  
Наверх
IP записан
 
KotMurza
Junior Member
**
Отсутствует


1C++ user

Сообщений: 24
Местоположение: Киев
Зарегистрирован: 20. Января 2013
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #6 - 12. Июля 2013 :: 09:59
Печать  
trad писал(а) 12. Июля 2013 :: 05:59:
Обычно делаю так:
declare @ТМЦ char(9) set @ТМЦ = ?
...
FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=@ТМЦ, (ТМЦ),(Кво)) as Рег";

Запрос.ДобПараметр(1,14,9,0);


Сработало! Мистика... До этого я делал точно также, но передавал 2 параметра: @Склад и @ТМЦ

Огромное спасибо. Хоть куда-то продвинулся )
Все работает отлично: и ВыполнитьСкалярный() и ВыполнитьИнструкцию()
« Последняя редакция: 12. Июля 2013 :: 11:51 - KotMurza »  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #7 - 14. Июля 2013 :: 15:08
Печать  
KotMurza писал(а) 12. Июля 2013 :: 09:59:
trad писал(а) 12. Июля 2013 :: 05:59:
Обычно делаю так:
declare @ТМЦ char(9) set @ТМЦ = ?
...
FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=@ТМЦ, (ТМЦ),(Кво)) as Рег";

Запрос.ДобПараметр(1,14,9,0);


Сработало! Мистика... До этого я делал точно также, но передавал 2 параметра: @Склад и @ТМЦ

Огромное спасибо. Хоть куда-то продвинулся )
Все работает отлично: и ВыполнитьСкалярный() и ВыполнитьИнструкцию()


да не мистика - добавив это изменение sql сервер сделал
сделал явное преобразование типов(точнее неявное) до char(9)
( до этого пробразование было скоере всего до char - увидеть это можно развернув виртуальную функцию )

PS запрос из первого поста скорее всего заработает если его поправить так

Код
Выбрать все
Запрос=СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	| SELECT Рег.КвоОстаток as Остаток
	| FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=cast(@ТМЦ as char(9)) , (ТМЦ),(Кво)) as Рег";

	Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
	Запрос.УстановитьТекстовыйПараметр("НаДату",ТекущаяДата());
	Ок=Запрос.Подготовить(ТекстЗапроса);
	Запрос.ДобПараметр(1,14,9,0,"@ТМЦ");
	Запрос.УстПараметр(1, ТМЦ);
		 Остаток=Запрос.ВыполнитьСкалярный();  




PS1 Мое мнение смешивать в одном запросе и параметры sql
и УстановитьТекстовыйПараметр абсолютно неправильно.
Пользуйтесь только чем то одним.
Как бы 0 можно оправдать что это тестовый пример.
  
Наверх
 
IP записан
 
KotMurza
Junior Member
**
Отсутствует


1C++ user

Сообщений: 24
Местоположение: Киев
Зарегистрирован: 20. Января 2013
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #8 - 14. Июля 2013 :: 15:54
Печать  
Z1 писал(а) 14. Июля 2013 :: 15:08:
PS1 Мое мнение смешивать в одном запросе и параметры sql
и УстановитьТекстовыйПараметр абсолютно неправильно.
Пользуйтесь только чем то одним...

Поначалу, я придерживался абсолютно такого-же мнения)
и поэтому:
KotMurza писал(а) 12. Июля 2013 :: 09:59:
... До этого я делал точно также, но передавал 2 параметра: @Склад и @ТМЦ...


Теперь - я поумнел. Пользуюсь только тем, что работает ))))
  
Наверх
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #9 - 14. Июля 2013 :: 16:57
Печать  
KotMurza писал(а) 14. Июля 2013 :: 15:54:
Z1 писал(а) 14. Июля 2013 :: 15:08:
PS1 Мое мнение смешивать в одном запросе и параметры sql
и УстановитьТекстовыйПараметр абсолютно неправильно.
Пользуйтесь только чем то одним...

Поначалу, я придерживался абсолютно такого-же мнения)
и поэтому:
KotMurza писал(а) 12. Июля 2013 :: 09:59:
... До этого я делал точно также, но передавал 2 параметра: @Склад и @ТМЦ...


Теперь - я поумнел. Пользуюсь только тем, что работает ))))

на еденичных запросах у параметров sql нет никакого преимущества перед установитьТекстовыйПараметр,
на массовых запросах да может быть выигрыш будет если
запрос с параметрами sql будет оставаться в кеше,
но на реальной загрузке практически не возможно оценить этот выигрыш.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #10 - 15. Июля 2013 :: 05:06
Печать  
скажу только две вещи
- преобразование типов тут совершенно никаким боком
- одновременное использование текстовых параметров и sql параметров совершенно не противопоказано
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3050
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #11 - 15. Июля 2013 :: 05:08
Печать  
Z1 писал(а) 14. Июля 2013 :: 15:08:
PS запрос из первого поста скорее всего заработает если его поправить так

Код
Выбрать все
Запрос=СоздатьОбъект("ODBCRecordSet");
	ТекстЗапроса = "
	| SELECT Рег.КвоОстаток as Остаток
	| FROM $РегистрОстатки.Остатки(:НаДату~,,Склад=:Склад AND ТМЦ=cast(@ТМЦ as char(9)) , (ТМЦ),(Кво)) as Рег";

	Запрос.УстановитьТекстовыйПараметр("Склад",Склад);
	Запрос.УстановитьТекстовыйПараметр("НаДату",ТекущаяДата());
	Ок=Запрос.Подготовить(ТекстЗапроса);
	Запрос.ДобПараметр(1,14,9,0,"@ТМЦ");
	Запрос.УстПараметр(1, ТМЦ);
		 Остаток=Запрос.ВыполнитьСкалярный();  



не заработает
  

1&&2&&3
Наверх
 
IP записан
 
KotMurza
Junior Member
**
Отсутствует


1C++ user

Сообщений: 24
Местоположение: Киев
Зарегистрирован: 20. Января 2013
Пол: Мужской
Re: Параметризованный запрос возвращает неправильный (нулевой) результат
Ответ #12 - 15. Июля 2013 :: 07:22
Печать  
trad писал(а) 15. Июля 2013 :: 05:06:
скажу только две вещи
- преобразование типов тут совершенно никаким боком
- одновременное использование текстовых параметров и sql параметров совершенно не противопоказано

Подтверждаю! Установлено эмпирическим путем со 100% достоверностью.
  
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать