Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.09.18;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.016 c
14-1124791702
ClubCoder
2005-08-23 14:08
2005.09.18
У кого есть свободное время?


14-1124634179
Yegorchic
2005-08-21 18:22
2005.09.18
Вопрос по в Word у


6-1117204422
Lex_!
2005-05-27 18:33
2005.09.18
MSXML2.XMLHTTP и получение файлов с интернета


6-1117201198
Asterot
2005-05-27 17:39
2005.09.18
Помогите люди добрые


6-1117191058
Dysan
2005-05-27 14:50
2005.09.18
какова максимальная нагрузка у idTCPServer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский