Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос про TADODataset.ParamCheck [D6, D7, D2005]


Германн ©   (2008-03-14 01:36:00) 

Обсуждение http://www.delphimaster.ru/cgi-bin/forum.pl?id=1205258821&n=18
закрыто. (По каким причинам - это не моё дело).
Но хочу повторить свой вопрос. Меня заинтересовало упомянутое Ega23 © свойство TADODataset.ParamCheck. Справку по нему я не понял. (Читал справку из Д6 и из BDS2006). Может кто-нибудь пояснит, чем отличаются значения True/False для данного свойства, при вводе текста запроса в рантайме?


Anatoly Podgoretsky   (2008-03-14 17:07:00) [1]

Ну или когда запрос сгенерирован кривым генератором, который включает комментарии типа

-- .... 18:30:47

Подобные вопросы мелькали по форуму


Anatoly Podgoretsky   (2008-03-14 17:05:00) [2]


> Использовал TADODataset с CommandText набранный в рантайме
> так:
>        CommandText:='SELECT Count(CX.ID_Card) AS CC FROM
> CARDIDX CX '+
>                      'WHERE CX.Id_Dev = :Id_Dev';
>        ADODataSet2.Parameters.ParamByName('Id_Dev').Value:
> =StrToInt(Dev);
>
>
> Получил ругань примерно как в упомянутом сабже. (Parameter
> ':data1' not found)

Очень мало информации, но
Command.Text и ADODataSet2. это могут быть разные вещи, я бы понял тебя если бы далее было Parameters.ParamByName или до ADODataSet2.CommandText

Параметра :data1 в запросе действительно нет, видимо он создан где то в дизайн тайм. Кроме того я бы предварительно, принудительно закрыл бы запрос, смотри пукт 1, непонятно что именно закрывать.

Короче тут налицо недостаток информации, про Connection тебе уже написали и налицо программная ошибка.

ParamCheck в таких простых случаях работает правильно, обычно его надо отключать только в неодназначных случаях, например FROM "C:\....."


Ega23   (2008-03-14 16:07:00) [3]


> ParamCheck = true - говорит о том, что компонент, при изменении
> текста запроса, должен сам инициировать коллекцию Parameters
> на основе запроса.


Вот только если в момент изменения CommandText отсутствует ADOConnection, то у парсера параметров происходит затык, ибо он не понимает, какого типа будут добавляемые параметры.


Германн   (2008-03-14 16:03:00) [4]

Спасибо всем принявшим участие.


Плохиш   (2008-03-14 10:51:00) [5]

ParamCheck = true - говорит о том, что компонент, при изменении текста запроса, должен сам инициировать коллекцию Parameters на основе запроса.
ParamCheck = false - при изменении текста запроса коллекция Parameters не будет изменена и программист должен сам позаботиться о соответствии.

Нормальными словами :-)

ParamCheck = true - я вальнул тебе запросик, а ты уж там разберись с ним сам как-нибуть.
ParamCheck = false - так, значится, я самый умный записал тебе запрос, а ты его как я скажу и отправишь серверу, и не отнимай драгоценных тиков процессора.


sniknik   (2008-03-14 10:33:00) [6]

> то-ли только в design-time работает
как раз таки наоборот, предназначено для рантайм, как в хелпе написано.

> 1. ParamCheck не отрабатывает при отсутствии ADOConnection  (Connection=nil)
пытается из коннекта определить тип параметра... и -> nil ... ?
хотя вообще то должен просто поставить тип "неопределен".

> 2. Какая-то непонятная кривизна при сметне текста запроса.
?
а поконкретнее -  условия выполнения, как/что задается, в чем "кривизна"?
сколько работаю ни разу ни видел, всегда адекватно, или объяснимо.


Ega23   (2008-03-14 09:51:00) [7]

Насколько я понял, ParamCheck то-ли только в design-time работает, то-ли как-то совсем криво.
Но чисто опытным путём было выявлено следующее поведение:
1. ParamCheck не отрабатывает при отсутствии ADOConnection  (Connection=nil)
2. Какая-то непонятная кривизна при сметне текста запроса.

Поскольку в большинстве случаев я в design-time ещё не имею адекватного коннекта, то всегда параметры создавал ручками (либо в дизайнере параметров в design-time, либо как sniknik ©   (14.03.08 08:25) [8])


sniknik   (2008-03-14 08:25:00) [8]

> Ну...вот только что проверил на TIBQuery и TIBSQL.
...
> Получил ругань примерно как в упомянутом сабже. (Parameter ':data1' not found)
форма запроса меняется, : это указатель для парсера в дельфе это следом параметр.

CommandText:='SELECT Count(CX.ID_Card) AS CC FROM CARDIDX CX WHERE CX.Id_Dev = ?';
Parameters.CreateParameter('Id_Dev', ftInteger, pdInput, 0, StrToInt(Dev));


дальше можно и как обычно по имени к этому параметру обращаться


Германн   (2008-03-14 02:47:00) [9]


> GanibalLector ©   (14.03.08 02:19) [6]
>
> 2 Германн ©   (14.03.08 02:06) [5]
>
> Может это из за Id_Dev (есть же уже  CX.Id_Dev). Попробуйте
> заменить на hId_Dev
>
>

Не знаю. Может из-за. Но "оч сильно сумлеваюсь". Бо эти две сущности относятся к (и рассматриваются) двум/я разным/и сущностям/и.
Пробовать лень, тем более, что работа уже сдана и без претензий. И деньги уже получены. Сей вопрос был "так, на всякий будущий случай!".
Поскольку он был про "непонятку" в справке.


GanibalLector   (2008-03-14 02:19:00) [10]

2 Германн ©   (14.03.08 02:06) [5]

Может это из за Id_Dev (есть же уже  CX.Id_Dev). Попробуйте заменить на hId_Dev


      CommandText:='SELECT Count(CX.ID_Card) AS CC FROM CARDIDX CX '+
                    'WHERE CX.Id_Dev = :hId_Dev';
      ADODataSet2.Parameters.ParamByName('hId_Dev').Value:=StrToInt(Dev);


Германн   (2008-03-14 02:06:00) [11]


> sniknik ©   (14.03.08 01:48) [2]
>
> True
> при внесении запроса автоопределение параметров. создает
> само.
>

Хм.
Использовал TADODataset с CommandText набранный в рантайме так:
       CommandText:='SELECT Count(CX.ID_Card) AS CC FROM CARDIDX CX '+
                     'WHERE CX.Id_Dev = :Id_Dev';
       ADODataSet2.Parameters.ParamByName('Id_Dev').Value:=StrToInt(Dev);


Получил ругань примерно как в упомянутом сабже. (Parameter ':data1' not found)


GanibalLector   (2008-03-14 02:00:00) [12]

> с чего это?

Ну...вот только что проверил на TIBQuery и TIBSQL.
При IBQuery1.ParamCheck:=False; запрос не выполняется. Parameter "DD" not found.


// IBQuery1.ParamCheck:=False; так запрос не выполнится
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select * from clitab where N>:DD');
IBQuery1.ParamByName('DD').AsInteger:=15;
IBQuery1.Open;


Если же запрос без параметров...например такой
select * from clitab where N>15
то все Ок.

Разве я не прав ???


sniknik   (2008-03-14 01:50:00) [13]

> невозможно будет выполнить запрос с параметрами.
с чего это?
все что программист отключил, он же завсегда и включить может... даже не трогая "рубильника".


sniknik   (2008-03-14 01:48:00) [14]

True
при внесении запроса автоопределение параметров. создает само.

False
придется самому (ну к примеру если в запросе путь к файлу таблици, то чтобы не восприняло : \папка\таблица.dbfкак параметр)


GanibalLector   (2008-03-14 01:45:00) [15]

Вероятно, при ParamCheck=False невозможно будет выполнить запрос с параметрами.


Наверх

Титульная страница Поиск, карта сайта Написать письмо