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

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

Как объявить параметры в TADOQuery? [D5, MSSQL]


nikolo ©   (2002-08-01 14:27:00) 

Help me! В обычном TQuery параметры объявлял так:

Query1.ParamByName("xxx").AsInteger := xxx;

А как объявляются параметры в TADOQuery?

Пробую так:
ADOQuery1.Parameters.ParamByName("xxx").Value := AlgId;

и так:
ADOQuery1.Parameters.ParamValues["xxx"] := AlgId;

и так:
ADOQuery1.Parameters.CreateParameter("xxx", ftInteger, pdInput, 10, nil);

но постоянно выходят ошибки типа: "Parameter object is improperly defined. Inconsistent or incomplete information was provided."

Как все-таки нужно?


KSergey   (2002-08-01 17:30:00) [1]

После динамического запрорса с параметрами - надо обязательно вызвать метод ParseSQL или что-то в этом духе, дельфи под рукой нет, проверить не могу.
Ну и назначать типы параметров, которые для access действительно плохо по умолчанию назначаются


shubin   (2002-08-01 15:36:00) [2]

http://borland.ru/products/downloads/download_delphi.html


nikolo   (2002-08-01 15:35:00) [3]

> Lord Warlock ©

Я даже делал так:

qry.Parameters.AddParameter.Name := "par1";
qry.Parameters.ParamByName("pmAlgId").Attributes:=[paNullable];
qry.Parameters.ParamByName("pmAlgId").DataType:=ftFixedChar;
qry.Parameters.ParamByName("pmAlgId").Direction := pdInput;
qry.Parameters.ParamByName("pmAlgId").Value := var1;


но все равно такая же ошибка!
Работаю я не с Access, а с MS SQL 2000.
2 параметра я делаю не одинаковые, а par1и par2соответственно.

Так что совершенно не понятно в чем заморочка, может действительно в патчах на Delphi5 и ADO?


Lord Warlock   (2002-08-01 15:27:00) [4]


> nikolo ©


Особенность ADO - после того как напишешь запрос с параметрами надо зайти в св-во parametrs и прописать их типы данных, иначе Access бывает неправильно его определяет.
Насчет второго одинакового параметра - так делать нельзя, параметров будет 2 но с одинаковыми именами (на эти грабли я уже наступал). Запрос может работать, но выдавать неправильный набор данных. Этого сразу даже не заметно :)


nikolo   (2002-08-01 15:24:00) [5]

А у меня вот не работает :( Где патчи взять-то?


nikolo   (2002-08-01 15:22:00) [6]

Ну как? Что скажете?


shubin   (2002-08-01 15:13:00) [7]

Да нифига можно одинаковые писать - только что попробывал


shubin   (2002-08-01 15:11:00) [8]

Извиняюсь за ошибку - типа Items к SQL приделал.
Что - то я криминала не вижу в запросе. Но батенька раз такая фигня - ну раздели запросы. Да и ещё у тебя пач для Delphi стоит?
(SP1 и на ADO). А то у меня все чудненько работает.


nikolo   (2002-08-01 15:07:00) [9]

Кажется я понял. По всей видимости, в ADO нельзя один и тот же параметр повторять несколько раз. Надо писать так:

qry.Close;
qry.SQL.Text := "Select * From Table1 Where Field1=:par1";
if BoolValue then
qry.SQL.Add(" and Field2=(Select Min(Field2) From Table1 Where Field1=:par2)");
qry.Parameters.ParamByname("par1").Value := var;
qry.Parameters.ParamByname("par2").Value := var;
qry.Open;


Или я не прав? Может быть все-таки можно, но как-то иначе?


jonik pegas   (2002-08-01 15:06:00) [10]

Текст ошибки тебе все вполне понятно обьясняет. Свойства параметра в ADO безглючней делать ручками


nikolo   (2002-08-01 14:59:00) [11]

Все правильно, этот код у меня тоже работает, но! Вот какой код НЕ работает:

qry.Close;
qry.SQL.Text := "Select * From Table1 Where Field1=:par1";
if BoolValue then
qry.SQL.Add(" and Field2=(Select Min(Field2) From Table1 Where Field1=:par1)");
qry.Parameters.ParamByname("par1").Value := var;
qry.Open;


И вот тут-то такая ошибка:
"Parameter object is improperly defined. Inconsistent or incomplete information was provided."

В чем тут дело?


jonik pegas   (2002-08-01 14:54:00) [12]

присваивание текста запроса
.......
adcvspom.Parameters.Clear;
adcvspom.parameters.addParameter.name:="id";
adcvspom.Parameters.ParamByName("id").DataType:=ftfixedchar;
adcvspom.Parameters.ParamByName("id").Attributes:=[paNullable];
adcvspom.Parameters.ParamByName("id").Value:=id;
Замеченые грабли: При использовании ADO+Jet4.0 Access после присваивания значения ыйд запроса он ИНОГДА неправильно определял сам количество и тип параметров отсюда adcvspom.Parameters.Clear и все создаем ручками.
При обращении по индексу он расставляет их не в порядке записи а в порядке следования в запросе


shubin   (2002-08-01 14:46:00) [13]

Лучше так.

ADOQuery - далее qry;
qry.Close;
qry.SQL.Items.Clear;
qry.SQL.Items.Add("Select * from tabl where field =:par1");
qry.Parameters.ParamByname("par1").Value = var;
qry.Open;


nikolo   (2002-08-01 14:41:00) [14]


> shubin (01.08.02 14:33)
> Проблема не в подстановке значения - всё правильно ( 1 вариант).
> Нужно смотреть сам запрос и коннект. Причем задать значения
> параметра можно сразу в инспекторе и активизировать запросик.


Сразу скажу в дизайнере задавать параметры не могу - из число заранее не известно.

Код примерно следующий:

ADOQuery1.Close;
ADOQuery1.SQL.Text := "Select * From Table1 Where Field1=:pmXXX";
{1 вариант}
ADOQuery1.Parameters.ParamValues["pmXXX"] := Var1;
{2 вариант}
ADOQuery1.Parameters.CreateParameter("pmXXX", ftInteger,
pdInput, 10, OV);
{3 вариант}
ADOQuery1.Parameters.ParamByName("pmXXX").AsInteger := Var1;
{4 вариант}
ADOQuery1.Parameters.ParamByName("pmXXX").Value := Var1;

ADOQuery1.Open;


И ни один из этих вариантов не работает! В чем проблема-то? Напишите примерчик, как именно делается присваивание значений параметрам.


Johnmen   (2002-08-01 14:33:00) [15]

Так объявлять или присваивать значение ???


shubin   (2002-08-01 14:33:00) [16]

Проблема не в подстановке значения - всё правильно ( 1 вариант).
Нужно смотреть сам запрос и коннект. Причем задать значения параметра можно сразу в инспекторе и активизировать запросик.
Если ошибка смотри ранее.


Наверх

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