Форум: "Базы";
Текущий архив: 2002.08.22;
Скачать: [xml.tar.bz2];
ВнизКак объявить параметры в TADOQuery? Найти похожие ветки
← →
nikolo (2002-08-01 14:27) [0]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."
Как все-таки нужно?
← →
Johnmen (2002-08-01 14:33) [1]Так объявлять или присваивать значение ???
← →
shubin (2002-08-01 14:33) [2]Проблема не в подстановке значения - всё правильно ( 1 вариант).
Нужно смотреть сам запрос и коннект. Причем задать значения параметра можно сразу в инспекторе и активизировать запросик.
Если ошибка смотри ранее.
← →
nikolo (2002-08-01 14:41) [3]
> 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;
И ни один из этих вариантов не работает! В чем проблема-то? Напишите примерчик, как именно делается присваивание значений параметрам.
← →
shubin (2002-08-01 14:46) [4]Лучше так.
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;
← →
jonik pegas (2002-08-01 14:54) [5]присваивание текста запроса
.......
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 и все создаем ручками.
При обращении по индексу он расставляет их не в порядке записи а в порядке следования в запросе
← →
nikolo (2002-08-01 14:59) [6]Все правильно, этот код у меня тоже работает, но! Вот какой код НЕ работает:
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 15:06) [7]Текст ошибки тебе все вполне понятно обьясняет. Свойства параметра в ADO безглючней делать ручками
← →
nikolo (2002-08-01 15:07) [8]Кажется я понял. По всей видимости, в 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;
Или я не прав? Может быть все-таки можно, но как-то иначе?
← →
shubin (2002-08-01 15:11) [9]Извиняюсь за ошибку - типа Items к SQL приделал.
Что - то я криминала не вижу в запросе. Но батенька раз такая фигня - ну раздели запросы. Да и ещё у тебя пач для Delphi стоит?
(SP1 и на ADO). А то у меня все чудненько работает.
← →
shubin (2002-08-01 15:13) [10]Да нифига можно одинаковые писать - только что попробывал
← →
nikolo (2002-08-01 15:22) [11]Ну как? Что скажете?
← →
nikolo (2002-08-01 15:24) [12]А у меня вот не работает :( Где патчи взять-то?
← →
Lord Warlock (2002-08-01 15:27) [13]
> nikolo ©
Особенность ADO - после того как напишешь запрос с параметрами надо зайти в св-во parametrs и прописать их типы данных, иначе Access бывает неправильно его определяет.
Насчет второго одинакового параметра - так делать нельзя, параметров будет 2 но с одинаковыми именами (на эти грабли я уже наступал). Запрос может работать, но выдавать неправильный набор данных. Этого сразу даже не заметно :)
← →
nikolo (2002-08-01 15:35) [14]> 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?
← →
shubin (2002-08-01 15:36) [15]http://borland.ru/products/downloads/download_delphi.html
← →
KSergey (2002-08-01 17:30) [16]После динамического запрорса с параметрами - надо обязательно вызвать метод ParseSQL или что-то в этом духе, дельфи под рукой нет, проверить не могу.
Ну и назначать типы параметров, которые для access действительно плохо по умолчанию назначаются
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.007 c