![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 при работе с другой таблицей.
Все таблицы по структуре одинаковы, поэтому прошу на этом ляпе не зацикливаться. :)