Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Текст запроса корёжит не по детски :( [D7, MSAccess]


Cobalt ©   (2004-08-11 00:43:00) 

Есть такой вот запрос:
const Table_Select_Enabled = 'SELECT :fnum, :fname, Enabled FROM :ftab WHERE Enabled=True';
------
 qrServ.SQL.Clear;
 qrServ.SQL.Text:=Table_Select_Enabled;
 qrServ.ParamByName('ftab').AsString:=FTableName; {'Operators'}
 qrServ.ParamByName('fnum').AsString:=FNumbField; {'ID'}
 qrServ.ParamByName('fname').AsString:=FNameField; {'Name'}
 qrServ.Prepared:=True;
 s:=qrServ.Text;

В результате получаю вот такой вот текст:
SELECT ?, ?, Enabled FROM ? WHERE Enabled=True

Вопрос - может, я делаю что-то не так?
P.S. Prepared использовал для того, что бы узнать - какой же текст передаётся.


Cobalt   (2004-08-11 10:59:00) [1]

Хм, по вашим репликам понял, что с параметрами не всё так просто :)
Полез в Dlphi Guide для Delphi6, и нашёл:
To use parameters, you must create a TParams object. For each parameter value, use
the TParams.CreateParam method to add a TParam object. Then use properties of
TParam to describe the parameter and set its value.


procedure TForm1.INSERT_WithParamsButtonClick(Sender: TObject);
var
   SQLstmt: String;
   stmtParams: TParams;
begin
stmtParams := TParams.Create;
try
  Database1.Connected := True;
  stmtParams.CreateParam(ftString, 'StateParam', ptInput);
  stmtParams.ParamByName('StateParam').AsString := 'CA';
  SQLstmt := 'INSERT INTO "Custom.db" '+
  '(CustNo, Company, State) ' +
  'VALUES (7777, "Robin Dabank Consulting", :StateParam)';
  Database1.Execute(SQLstmt, stmtParams, False, nil);
finally
  stmtParams.Free;
end;
end;


If the SQL statement includes a parameter but you do not supply a TParam object to
provide its value, the SQL statement may cause an error when executed (this
depends on the particular database back-end used). If a TParam object is provided
but there is no corresponding parameter in the SQL statement, an exception is raised
when the application attempts to use the TParam.


Но вот, к сожаления, там не упомянуто, что имена таблиц и полей не могут быть парметрами :(


sniknik   (2004-08-11 01:48:00) [2]

> только после надо руками их создавать.
например
ADOCommand1.ParamCheck:= false; //чтобы дельфя нам не "помогала"
ADOCommand1.CommandText:= 'INSERT INTO Table1 ([Date]) VALUES (?)'; //вопрос вместо параметра (!)
ADOCommand1.Parameters.CreateParameter('Dat', ftDateTime, pdInput, 0, Now());
ADOCommand1.Execute;


sniknik   (2004-08-11 01:42:00) [3]

> В результате получаю вот такой вот текст:
> SELECT ?, ?, Enabled FROM ? WHERE Enabled=True
это правильный запрос получился (не считая вопроса после FROM), просто другая форма записи. вопрос это неопреденный параметр. можно и так писать только после надо руками их создавать. ты видать вытащил запрос на этапер преобразования.


jack128   (2004-08-11 01:41:00) [4]


> да, и имя таблици параметром нельзя передавать.
> Все-таки я оказался прав
хе. Какая разница!! Ни ты, ни я не заметили, что
> ни одной неизвестной величины с с базы не достается!- это верный признак, что пора спать.


GanibalLector   (2004-08-11 01:39:00) [5]

да, и имя таблици параметром нельзя передавать.
Все-таки я оказался прав.+


sniknik   (2004-08-11 01:38:00) [6]

> Есть такой вот запрос:
запрос мечта поэта! ни одной неизвестной величины с с базы не достается! все только известные и переданные с клиента. класс. ;о))

да, и имя таблици параметром нельзя передавать.


jack128   (2004-08-11 01:36:00) [7]

в Ib нельзя. А в акссесе, кто его знает, может и можно.. Но дело не в этом. После припарирования запрос может быть любым - я так понимаю строка SELECT ?, ?, Enabled FROM ? WHERE Enabled=True будет передоваться сервером, а значения параметров - отдельной структурой.
Мне вообще не понятно, что Кобальт хочет получить?

'SELECT 'Id', 'Name', Enabled FROM 'Operators' WHERE Enabled=True' ? Так что ли? Ну так некогда ты этого не получишь..


GanibalLector   (2004-08-11 01:31:00) [8]

2 jack128 ©
А разве можно  FROM :ftab???Пробовал в Ib ... дык,говорит НИЗЯ.


jack128   (2004-08-11 01:27:00) [9]

а что тебе не нравиться? Что то не работает?


GanibalLector   (2004-08-11 01:21:00) [10]

А разве можно указывать  FROM :ftab ???
Сдается мне,что тут собака зарыта.


Наверх

Титульная страница Поиск, карта сайта Написать письмо