Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.13;
Скачать: CL | DM;

Вниз

Вопрос про TADODataset.ParamCheck   Найти похожие ветки 

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

Обсуждение http://delphimaster.net/view/2-1205258821/
закрыто. (По каким причинам - это не моё дело).
Но хочу повторить свой вопрос. Меня заинтересовало упомянутое Ega23 © свойство TADODataset.ParamCheck. Справку по нему я не понял. (Читал справку из Д6 и из BDS2006). Может кто-нибудь пояснит, чем отличаются значения True/False для данного свойства, при вводе текста запроса в рантайме?


 
GanibalLector ©   (2008-03-14 01:45) [1]

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


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

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

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


 
sniknik ©   (2008-03-14 01:50) [3]

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


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

> с чего это?

Ну...вот только что проверил на 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
то все Ок.

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


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


> 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:19) [6]

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:47) [7]


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

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


 
sniknik ©   (2008-03-14 08:25) [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));


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


 
Ega23 ©   (2008-03-14 09:51) [9]

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

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


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

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

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

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


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

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

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

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


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

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


 
Ega23 ©   (2008-03-14 16:07) [13]


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


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


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


> Использовал 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:\....."


 
Anatoly Podgoretsky ©   (2008-03-14 17:07) [15]

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

-- .... 18:30:47

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



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

Текущий архив: 2008.04.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.015 c
15-1204235123
boa_kaa
2008-02-29 00:45
2008.04.13
На тему пиратства


2-1206023020
andreil
2008-03-20 17:23
2008.04.13
Как получить параметры для уже выполняющейся программы?


2-1206027422
AntonUSAnoV
2008-03-20 18:37
2008.04.13
Не могу установить фильтр на таблицу


3-1195575987
ari_9
2007-11-20 19:26
2008.04.13
Длинные (несколько суток) читающие транзакции в FB. Как лучше ?


2-1205845556
Adios
2008-03-18 16:05
2008.04.13
сообщения в программу по сети