Форум: "Начинающим";
Текущий архив: 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