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

Вниз

ADO. Parameters.   Найти похожие ветки 

 
DeepProg   (2005-08-10 16:37) [0]


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-10 16:53) [1]


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

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

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


 
Anatoly Podgoretsky ©   (2005-08-10 17:38) [2]

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


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

Да вроде, по вашему же с Петровичем примеру делал...
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-11 20:13) [4]

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


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

Не догоняю.

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

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

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

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


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

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


 
Anatoly Podgoretsky ©   (2005-08-11 20:37) [7]

На самом деле откажись от использования ручного создания параметров.
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:42) [8]

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


 
Anatoly Podgoretsky ©   (2005-08-11 20:48) [9]

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


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


> 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 ©   (2005-08-12 11:24) [11]

>Anatoly Podgoretsky ©   (11.08.05 20:37) [7]
>ADOQ.Parameters.ParseSQL(ADOQ.SQL.Text, true);

Зачем эта строка ?


 
Anatoly Podgoretsky ©   (2005-08-12 12:18) [12]

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


 
DeepProg   (2005-08-12 23:09) [13]

Я думал, что только для анализа строки на предмет наличия в ней параметров. И вообще было бы логично, если параметры сначала создавались, а уж потом строка передавалась parser"y, который в своб очередь обращался бы к созданным определениям параметров и подставлял их значения в соотсетствующие места sql-строки...

Ставлю вопрос жестко: почему возникает ошибка, указанная в комментарии в [10]? Что нужно сделать чтобы приведенный там код работал? Он должен работать, если его приводят в качестве примера


 
Anatoly Podgoretsky ©   (2005-08-12 23:37) [14]

DeepProg   (12.08.05 23:09) [13]
Второй параметр отвечает за создание. Это и есть парсер, который может при этом или создавать параметры или нет. Нельзя автоматически создать параметры не произведя анализ - неизвестно что создавать.


 
DeepProg   (2005-08-13 14:07) [15]

Провел простой тест вне разрабатываемого приложения.
Этот код отрабатывает полностью: и параметр есть и 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 ©   (2005-08-13 14:28) [16]

ADOQ.Parameters.Items[0].Name/DataType/...
можешь посмотреть все характеристики



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

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

Наверх




Память: 0.51 MB
Время: 0.044 c
9-1116198205
Gar
2005-05-16 03:03
2005.09.18
RPG Creating


14-1124270492
vtsoy
2005-08-17 13:21
2005.09.18
Что такое API?


14-1124574469
Knight
2005-08-21 01:47
2005.09.18
У вас когда-нить йогурт в руках взрывался?


3-1123481851
Layner
2005-08-08 10:17
2005.09.18
Как удалить БДЕ


4-1122537737
chili
2005-07-28 12:02
2005.09.18
Изменение частоты обновления экрана ?