Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Вниз

Параметры с одинаковыми именами   Найти похожие ветки 

 
Bless   (2003-06-27 16:47) [0]

Всем привет!

Люди, если написать что-то вроде

ADOQuery1.SQL.Text:=
"SELECT t1.*, t2.*
FROM t1, t2
WHERE t1.kod=:par1 and t2.kod=:par1";

то в ADOQuery1.parameters появляются два одинаковых
параметра par1 (всегда удивлялся этому факту)

По этому поводу вопрос:
1) Каким образом строка
АDOQuery1.ParamByName("par1").value:=1;
меняет свойство value у обоих параметров? (здесь и ниже под словом "параметр"
понимается объект класса TParameter)
Причем, делает это только в случае, если у обоих параметров с именем par1
одинаковый DataType и этот DataType<>ftUnknown.
В противном случае эта строка меняет value только у одного из них.

От просмотра исходника модуля ADODB в голове не прояснилось

Отсюда вытекает еще один вопрос, как мне корректно
присвоить какое-нибудь значение ВСЕМ
параметрам с именем par1?
Раньше писал просто АDOQuery1.ParamByName("par1").value:=1 и работало, но
сегодня обнаружил эту фишку с разным типами (и с типом ftUnknown).


 
Anatoly Podgoretsky   (2003-06-27 16:55) [1]

А зачем тебе два одинаковых имени, как из отличать то, почему не хочешь назвать par1 и par2 или религия не позволяет, потрахаться желательно?


 
ikis   (2003-06-27 17:00) [2]

Ответа не знаю, но... есть предложение:

ADOQuery1.SQL.Text:=
"SELECT t1.*, t2.*
FROM t1, t2
WHERE t1.kod=t2.kod
AND t2.kod=:par1";


 
Bless   (2003-07-01 13:17) [3]

Anatoly Podgoretsky >
>А зачем тебе два одинаковых имени, как из отличать то,
> почему не хочешь назвать par1 и par2 или религия не позволяет, >потрахаться желательно?

Гм... Если не хочешь отвечать на вопрос не отвечай. А хамить ни к чему.
Было бы охота потрахаться, трахался бы без форума - так дольше.
А раз задал вопрос, то трахаться не охота.

Можно, конечно называть параметры по-разному. Но у меня текст запроса меняется в зависимости от того, что там пользователь на формочке накликал, где галочек понаставлял и т.д.
И я наперед не знаю, сколько раз в запросе всплывет тот или иной параметр, чтоб называть его :par1, :par2, :par3...
Да и почему я должен одно и то же число называть разными именами


Конечно, эту проблему легко решить, но может быть можно избежать самой проблемы, вместо того чтобы ее решать? Потому и спрашиваю.


to ikis> Да я этот запрос просто для примера привел. В приведеннм мной запросе конечно же можно сделать так как ты предложил, но не всегда это возможно.


 
Johnmen   (2003-07-01 13:51) [4]

>Bless

Каждый параметр определяется совокупностью своих свойств. Два идентичных параметра - суть один единственный с т.з. своего значения. Но с т.з. парсера SQL выражения - это разные сущности...


 
Семен Сорокин   (2003-07-01 13:59) [5]

а
Parameters[0].Value = ...
Parameters[1].Value = ...

не устроит?


 
KSergey   (2003-07-01 14:01) [6]

Помнится для такого случая в факах советуют что-то типа такого (если не заблуждаюсь)

DECLARE @p int -- например, тип от фонаря пишу
SET @p=:P1

SELECT .... -- здесь уже применяем @p столько раз, сколько нужно


 
Anatoly Podgoretsky   (2003-07-01 14:03) [7]

Bless (01.07.03 13:17)
Тем более не понятно, зачем три одинаковых имени?


 
Bless   (2003-07-01 16:04) [8]


KSergey © (01.07.03 14:01)> Думаю,подойдет. Спасибо.


Anatoly Podgoretsky © (01.07.03 14:03)>
Ладно. В таблице в 2-х полях хранятся месяц и год какой-то даты.
Например, дата заполнения документа.
(Способ хранения даты не я придумал, менять его нельзя).
Чтобы получить все документы, заполненные с января 2002 по май 2002, надо написать что-то типа

with query1 do begin
SQL.Text:="SELECT * FROM t1"+
" WHERE (t1.year>=:firstyear) AND (t1.year<=:lastyear)"+
" OR (t1.year=:firstyear)AND (t1.month>=:firstmonth)"+
" OR (t1.year=:lastyear)AND (t1.month<=:lastmonth)";
end;
Поcле этого в списке параметров будет 2 параметра с именем
firstyear, 2 - lastyear, 1-firstmonth, 1- lastmonth
И после
parameters.ParamByName("firstyear").Value:=2002;
parameters.ParamByName("firstmonth").Value:=1;
parameters.ParamByName("lastyear").Value:=2002;
parameters.ParamByName("lastmonth").Value:=5;

останется 1 параметр firstyear со значение 2002, а второй -
со значением null и 1 lastyear со значение 2002, а второй -
со значением null, что,конечно же, не совсем то, что я ожидаю.

А мне совсем не хочется писать:

with query1 do begin
SQL.Text:="SELECT * FROM t1"+
" WHERE (t1.year>=:firstyear1) AND (t1.year<=:lastyear1)"+
" OR (t1.year=:firstyear2)AND (t1.month>=:firstmonth)"+
" OR (t1.year=:lastyear2)AND (t1.month<=:lastmonth)";
parameters.ParamByName("firstyear1").Value:=2002;
parameters.ParamByName("firstyear2").Value:=2002;

parameters.ParamByName("firstmonth").Value:=1;
parameters.ParamByName("lastyear1").Value:=2002;
parameters.ParamByName("lastyear2").Value:=2002;
parameters.ParamByName("lastmonth").Value:=5;
end;


>Johnmen © (01.07.03 13:51)
>Каждый параметр определяется совокупностью своих свойств. Два >идентичных параметра - суть один единственный с т.з. своего >значения. Но с т.з. парсера SQL выражения - это разные >сущности...

Да я это понимаю.
Просто через BDE-шные компоненты (paradox)в аналогичной ситуации

SELECT t1.*, t2.*
FROM t1, t2
WHERE t1.kod=:par1 and t2.kod=:par1


в списке параметров - тоже 2 одноименных параметра, но
для запроса

paramByName("par1").value:=1 работает для обеих параметров. Потому что на самом деле это все один параметр (params[0]=params[1], я проверял), хоть в списке их несколько.

А через ADO-компоненты (MSSQL), оказывается, все не так. И parameters[0]<>parameters[1], даже если parameters[0].name=parameters[1].name.
Что непонятно и неудобно, но с чем, видимо, ничего не поделаешь.

И на свой собственный вопрос
>...Каким образом строка
>АDOQuery1.ParamByName("par1").value:=1;
>меняет свойство value у обоих параметров?...


могу ответить сам:
"Внимательней проверяй, прежде чем спрашивать. Для ADOQuery
АDOQuery1.ParamByName("par1").value:=1;
не поменяет свойство value у обоих параметров на 1, даже если они одинакового типа. И даже если последующий ADOQuery1.Open не вызывает ошибок, то это еще не значит, что он отработал ПРАВИЛЬНО."

Всем спасибо. Ситуация понятна.


 
Anatoly Podgoretsky   (2003-07-01 16:29) [9]

Вот именно ты ожидаешь не то, что есть на самом деле. На самом деле у тебя есть Parameters[0]..Parameters[5] среди которых при помощи ParamByName ищется первое вхождение в списке параметров!!!
Или присваивай значения по индексу или сделай разные имена.

Ожидать что везде будет заменяться все par1 конечно можно, но расчитывать на это не стоит. Сия будет зависить от многого, от движка его парсера, их версий.



 
Fay   (2003-07-02 16:45) [10]

declare @par1 int
select @par1 = :par1

SELECT t1.*, t2.*
FROM t1, t2
WHERE t1.kod=@par1 and t2.kod=@par1



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2003.07.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
14-78043
Домарощинер
2003-07-09 19:49
2003.07.24
Перезагрузка матрицы в анекдотах


14-78137
Nikkk
2003-07-08 23:07
2003.07.24
Домашняя cеть в WinME


1-77972
AndreyAs
2003-07-11 11:36
2003.07.24
Как обойти circular unit reference ?


1-77856
чайниковский
2003-07-10 10:21
2003.07.24
DirectX


14-78059
PlaTinum
2003-07-07 22:13
2003.07.24
Архивация данных





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский