Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
Доброго времени суток, ув. форумчане! Есть код процедуры:

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
 if TreeView1.Selected.Text <> 'Все файлы' then
  begin
   MyAdoQ.Close;
   MyAdoQ.Parameters[0].Value := QuotedStr(TreeView1.Selected.Text);
   MyAdoQ.Open;
   ADOQuery3.Close;
   ADOQuery3.Parameters[0].Value := MyAdoQ.Fields[0].AsString;
   ADOQuery3.Open;
   DBGrid1.DataSource := DataSource2;
  end else DBGrid1.DataSource := DataSource1;
end;


1. Дело в том что MyAdoQ.Parameters[0].Value := QuotedStr(TreeView1.Selected.Text) не работает. Выводил в Memo а там просто запрос с параметром :Q. При этом ADOQuery3.Parameters[0].Value := MyAdoQ.Fields[0].AsString работает, если я создам MyAdoQ в процедуре перед этим вручную.
2. В ADOQuery3 стоит свойство Prepared = true, но проблема в том, что если убрать ADOQuery3.Close, то данные в DBGrid меняются только один раз и дальше уже изменить параметр не получается.
3. И хотелось бы понять, работает ли Prepared вообще. В интернете не нашел информации по этому поводу, целый день голову ломаю.
Заранее спасибо всем кто отликнется!

Сообщение было отредактировано: 18 ноя 20, 18:14
18 ноя 20, 13:42    [22234569]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
Gerasimenko
Member

Откуда:
Сообщений: 4623
bors,

QuotedStr в данном случае: лишний
18 ноя 20, 13:44    [22234571]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
Gerasimenko,

Спасибо! И правда, помогло! Но... Почему? Там же латинские буквы

Сообщение было отредактировано: 18 ноя 20, 13:50
18 ноя 20, 13:55    [22234576]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
alekcvp
Member

Откуда:
Сообщений: 2494
bors
Gerasimenko,
Спасибо! И правда, помогло! Но... Почему? Там же латинские буквы

Потому СУБД сама разбирается с параметрами и ей там кавычки не требуются.
18 ноя 20, 13:57    [22234578]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
alekcvp,

стоило бы догадаться, но, не додумался до этого. Спасибо за информацию! Вот бы еще и с остальными вопросами разобраться:)
18 ноя 20, 14:05    [22234582]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

bors
Почему?

Очевидно потому, что значения в БД у тебя без кавычек.

Posted via ActualForum NNTP Server 1.5

18 ноя 20, 14:09    [22234584]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
Dimitry Sibiryakov,

Я и не скрываю этого, поэтому и пришел сюда узнавать что-то новое, чего собственными силами не смог найти/не знал что и где искать:)
18 ноя 20, 14:12    [22234589]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

bors
Я и не скрываю этого

Скрываешь. Ты нигде не упомянул, что у тебя в БД значения хранятся без кавычек.

Posted via ActualForum NNTP Server 1.5

18 ноя 20, 14:30    [22234605]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
Dimitry Sibiryakov,

Прошу простить, неверно понял что имеете в виду:)

Однако, все равно слабо понимаю как работает св-во prepared в adoquery, и верно ли я пытаюсь его использовать

Сообщение было отредактировано: 18 ноя 20, 14:31
18 ноя 20, 14:34    [22234612]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
bors
Почему?
Есть два способа вызвать запрос с параметрами.

1. Неправильный. Вставить значения непосредственно в текст запроса
Query1.SQL.Text := 'SELECT * FROM mytable WHERE fld1 = ' + param1 + ' AND fld2 = ' + param2;

Здесь переменные param1, param2 должны быть delphi строками строго в формате SQL. Строки в кавычках, даты в кавычках и в определенном формате, дробные числа с разделителем точкой и т.д

2. Правильный. Сформировать параметрический запрос и заполнить параметры
Query1.SQL.Text := 'SELECT * FROM mytable WHERE fld1 = :param1 AND fld2 = param2';
Query1.ParamByName('param1').Value := param1;
Query1.ParamByName('param2').Value := param2;

Здесь переменные param1, param2 должны быть такого же (или пподобного) типа, как и соответствующие поля в базе (string, TDateTime, Double) и содержать ровно те данные, которые нужно передать на сервер без дополнительных символов, спец.форматирования и т.д. А клиентская библиотека и сервер уже сами разберутся, что с ними делать
18 ноя 20, 14:40    [22234616]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
_Vasilisk_,

Спасибо большое за подробный ответ! Наконец-то дошло:)
18 ноя 20, 14:45    [22234624]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
bors
2. В ADOQuery3 стоит свойство Prepared = true, но проблема в том, что если убрать ADOQuery3.Close, то данные в DBGrid меняются только один раз и дальше уже изменить параметр не получается.
Потому, что, скорее всего, метод Open реализован так (или похоже)
procedure TAdoQuery.Open;
begin
  if not FOpened then begin
    ExecQuery;
    FOpened := True;
  end;
end;
Соответственно если датасет у вас не закрывается, то библиотека не считает его необходимым открывать.
bors
3. И хотелось бы понять, работает ли Prepared вообще
Да. Но оно обычно автоматически устанавливается в True при візове методов ParamByName или Open. И необходивость делать прямое присвоение
Prepared := True;
возникает крайне редко. Обычноо это делается для того, чтобы отвалидировать запрос без его выполнения
18 ноя 20, 14:49    [22234628]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51775

_Vasilisk_
Есть два способа вызвать запрос с параметрами.

И, строго говоря, в первом случае получается запрос без параметров.

Posted via ActualForum NNTP Server 1.5

18 ноя 20, 14:55    [22234636]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
_Vasilisk_,

Огрооомнейшая Вам благодарность! Столько времени и нервов потратил чтобы понять описанные Вами вещи
18 ноя 20, 14:56    [22234637]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
Dimitry Sibiryakov

_Vasilisk_
Есть два способа вызвать запрос с параметрами.

И, строго говоря, в первом случае получается запрос без параметров.


Изначально запрос и был записан как в варианте 1, поэтому и ошибочно решил что делая запрос способом 2 следует передавать параметры как в варианте 1
18 ноя 20, 14:58    [22234640]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
bors
Member

Откуда:
Сообщений: 27
_Vasilisk_

bors
3. И хотелось бы понять, работает ли Prepared вообще
Да. Но оно обычно автоматически устанавливается в True при візове методов ParamByName или Open. И необходивость делать прямое присвоение
Prepared := True;
возникает крайне редко. Обычноо это делается для того, чтобы отвалидировать запрос без его выполнения


Если вызывать ADOQuery.Active := True; и Prepared := True; должно работать?

Сообщение было отредактировано: 18 ноя 20, 15:51
18 ноя 20, 15:56    [22234702]     Ответить | Цитировать Сообщить модератору
 Re: Не работает параметр в запросе ADOQuery  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12319
bors
Если вызывать ADOQuery.Active := True; и Prepared := True; должно работать?

_Vasilisk_
необходивость делать прямое присвоение возникает крайне редко.
18 ноя 20, 16:10    [22234717]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить