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

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

ADO. Parameters.


DeepProg ©   (2005-08-10 16:37:00) 


const
AField = 'f1' // такое поле есть в таблице mytable
sConnectionString = 'provider=sqloledb,...'
ParentApp = 'appl1' // запись с таким значением поля app существует
sTableName = 'mytable'
...
ADOQ := TADOQuery.Create(Nil);
   ADOQ.ConnectionString :=sConnectionString;
       ADOQ.SQL.Text := 'SELECT DISTINCT '+ AField+ ' FROM '+sTableName+' WHERE app= :papp'
       ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text, true);
        with ADOQ.Parameters.AddParameter do
     begin
      Name := 'papp';
      DataType := ftString;
      Direction := pdInput;
                               Value := ParentApp
     end;
        ADOQ.Open;
...

поле app  - varchar(255)
Выполнение запроса приводит к ошибке:
"parameter object is improper defined. Inconsistent or incomplete information was provided"
Строка после ParseSQL, действительно получается неверной:
'SELECT DISTINCT part FROM evlog WHERE app= ?'#$D#$A#0'p'#$D#$A
Что не так?


DeepProg   (2005-08-12 07:09:00) [1]


> ADOQ := TADOQuery.Create(Nil);
> ADOQ.ConnectionString :=sConnectionString;
> ADOQ.SQL.Text := 'SELECT DISTINCT '+ AField+ ' FROM '+sTableName+'
> WHERE app= :papp'
> ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text, true);
> ADOQ.Parameters.ParamByName('papp').Value := ParentApp;
//Parameter not found.
> ADOQ.Open;

ВЫ с Петровичем об этом так уверенно пишете, что у меня сложилось впечатление, что я не выполнил какую-то часть настройки. msguns © >Anatoly Podgoretsky ©   (11.08.05 20:37) [7]
>ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text, true);

Зачем эта строка ? Anatoly Podgoretsky © Для анализа и создания параметров. DeepProg Я думал, что только для анализа строки на предмет наличия в ней параметров. И вообще было бы логично, если параметры сначала создавались, а уж потом строка передавалась parser'y, который в своб очередь обращался бы к созданным определениям параметров и подставлял их значения в соотсетствующие места sql-строки...

Ставлю вопрос жестко: почему возникает ошибка, указанная в комментарии в [10]? Что нужно сделать чтобы приведенный там код работал? Он должен работать, если его приводят в качестве примера Anatoly Podgoretsky © DeepProg   (12.08.05 23:09) [13]
Второй параметр отвечает за создание. Это и есть парсер, который может при этом или создавать параметры или нет. Нельзя автоматически создать параметры не произведя анализ - неизвестно что создавать. DeepProg Провел простой тест вне разрабатываемого приложения.
Этот код отрабатывает полностью: и параметр есть и parser его проглатывает.

  ADOQ := TADOQuery.Create(nil);
  ADOQ.SQL.Text := 'SELECT DISTINCT part FROM mytable WHERE app = :papp';
  ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text,true);
  ADOQ.Parameters.ParamByName('papp').Value := 'appl1';
  ShowMessage(IntToStr(ADOQ.Parameters.Count));
  ADOQ.Free;

Теперь бы неполохо разобраться, что может мешать parser'y в реальном приложении. Кажется, я догадываюсь - где-то остался ляп с именами в смысле глобальные/локальные переменные - это уже мои проблемы. Всем спасибо. Anatoly Podgoretsky © ADOQ.Parameters.Items[0].Name/DataType/...
можешь посмотреть все характеристики


Anatoly Podgoretsky   (2005-08-11 20:48:00) [2]

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


DeepProg   (2005-08-11 20:42:00) [3]

За пример, спасибо.
Еще вопрос.
Как правильно работать с параметрами созданными вручную, если воникнет проблема с автоопределением типов?


Anatoly Podgoretsky   (2005-08-11 20:37:00) [4]

На самом деле откажись от использования ручного создания параметров.
ADOQ := TADOQuery.Create(Nil);
ADOQ.ConnectionString :=sConnectionString;
ADOQ.SQL.Text := 'SELECT DISTINCT '+ AField+ ' FROM '+sTableName+' WHERE app= :papp'
ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text, true);
ADOQ.Parameters.ParamByName('papp').Value := ParentApp;
ADOQ.Open;

Ты из правильных примеров сделал неверную компиляцию.


DeepProg   (2005-08-11 20:34:00) [5]

Или вы имели ввиду
ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text,   true); ?


DeepProg   (2005-08-11 20:24:00) [6]

Не догоняю.

> Так ты создаешь один параметр, а затем добавляешь еще один.

Хорошо - это от незнания принципов(help мне не помог)
> не используй ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text, true);

А как тогда? Параметры я использую исключительно ради устранения гимора с кавычками.
К тому же мне не понятно, почему строка, возвращаемая ParseSQL не используется напрямую.

Как грамотно решить задачу: подставлять значения из переменных string в однотипные запросы?
т.е. я хочу послать БД запрос
select * from mytable where app='appl1'
Но я не хочу ставить кавычки, требуемые синтаксисом SQL, руками, а хочу чтобы это сделал parser.


Anatoly Podgoretsky   (2005-08-11 20:13:00) [7]

Если ты хочешь вручную задавать параметр, то не используй ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text, true);
Так ты создаешь один параметр, а затем добавляешь еще один.


DeepProg   (2005-08-11 20:05:00) [8]

Да вроде, по вашему же с Петровичем примеру делал...
http://forum.sources.ru/index.php?showtopic=74829&hl=Запросы+и+параметры
Хотя, насколько я помню, такой вызов

...
with ADOQ.Parameters.AddParameter do
    begin
     Name := 'papp';
     DataType := ftString;
     Direction := pdInput;
     Value := ParentApp
    end;
ADOQ.Parameters.ParamByName('papp').Value := ParentApp;
ADOQ.Open;
...

действительно, возвращал ошибку "Parameter not found"...

Сейчас код и  БД недоступны, но боюсь, мне все равно потебуется полный пример. Would you be so kind?..


Anatoly Podgoretsky   (2005-08-10 17:38:00) [9]

Ты не тому параметру присваиваешь значение.
ShowMessage(IntToStr(ADOQ.Parameters.Count))


DeepProg   (2005-08-10 16:53:00) [10]


> Строка после ParseSQL, действительно получается неверной:

Для приведенного кода она выглядит вот так:
'SELECT DISTINCT f1 FROM mytable WHERE app= ?'#$D#$A#0'p'#$D#$A

Выше приведена строка из Watch'a при работе с другой таблицей.
Все таблицы по структуре одинаковы, поэтому прошу на этом ляпе не зацикливаться. :)


Наверх

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