Запросы и TQuery

EgorA
Дата: 18.10.2006 14:03:55
Сначала я использовал визуальный элемент Query, чтобы делать из Delphi запросы к базе данных, потом стал создавать Query прямо в коде, но всё равно все запросы сделаны, фактически с использованием этого элемента.
Задалбывает, что для каждого запроса query нужно создать, открыть, закрыть и т.д. Вешать на форму тонну визуальных элементов тоже как-то не катит (запросов много). Есть какой-нибудь менее кривой способ работы с БД из под дельфей?
tygra
Дата: 18.10.2006 14:07:49
Есть - используйте один Query для всех запросов

-- Tygra's --
Моя фотогалерея тут
tru55
Дата: 18.10.2006 14:13:28
Задалбывает, что для каждого запроса query нужно создать, открыть, закрыть и т.д

Интересно, а как по другому? Если отвлечься от Delphi - как происходит работа с SQL-СУБД? Сижу это я в инструменте, позволяющем посылать запросы (например, для Oracle - SQL*PLus). Написал запрос (аналог "создать"), нажал Enter (аналог "открыть"), далее создаю следующий и т.д.
Brenagwynn
Дата: 18.10.2006 14:19:17
Сорри, запостил не дописАв :)
А чем, собственно, плохо?
with TQuery.Create(nil) do
try
  SQL.Add(текст запроса);
  ...
  Open; // или ExecSQL
  ...
finally
  Free;
end;
Куликов Алексей
Дата: 18.10.2006 14:20:39
EgorA
... Вешать на форму тонну визуальных элементов тоже как-то не катит (запросов много) ...


- Во первых с каких это пор TQuery стал визуальным компонентом?
- Во вторых кто тебе мешает создавать и уничтожать компоненты динамически, по мере надобности?
Obrazer
Дата: 18.10.2006 14:26:27
procedure ExecQuery(Db: TDatabase; SQL: String);
var
  qu: TQuery;
begin
  qu := TQuery.Create(Nil);
  try
    qu.DatabaseName := Db.DatabaseName;
    qu.SQL.Add(SQL);
    qu.ExecSQL;
  finally
    qu.Close;
    qu.Free;
  end;
end;

function BeginSelectQuery(Db: TDatabase; var qu: TQuery; SQL: String): Boolean;
begin
  qu := TQuery.Create(Nil);
  qu.DatabaseName := Db.DatabaseName;
  qu.SQL.Add(SQL);
  qu.Open();
  Result := not qu.EOF;
  xTraceOpenDataset(qu);
end;

procedure EndSelectQuery(var qu: TQuery);
begin
  if not Assigned(qu) then Exit;
  if qu.Active then qu.Close;
  xTraceCloseDataset(qu);
  qu.Free;
end;

А пользоваться можно так
procedure ...;
var q: TQuery;
begin
  BeginSelectQuery(db, q, 'SELECT...');
  try
    // здесь код работы с q
  finally
    EndSelectQuery(q);
  end;
end;
softwarer
Дата: 18.10.2006 14:27:33
EgorA
Есть какой-нибудь менее кривой способ работы с БД из под дельфей?

Прямой способ - это использовать набросанные компоненты для сложных запросов и стандартные подпрограммы для простых.
A.K.
Дата: 18.10.2006 14:33:47
Для запросов, не возвращающих НД, можно еще TDatabase.Execute пользоваться, или написать процедурку, которая создает, выполняет и уничтожает запрос - чтобы каждый раз эту канитель не писать.
EgorA
Дата: 18.10.2006 14:34:17
tygra
Есть - используйте один Query для всех запросов


я так и делаю, но всё равно это постоянное пересоздание-открытие query имхо ужасно засоряет код.
softwarer
Дата: 18.10.2006 14:34:46
Obrazer
procedure ExecQuery(Db: TDatabase; SQL: String);

Фи. Я еще понимаю самому такое использовать, но учить молодежь неправильному стилю проектирования - совсем никуда не годится.

function TGIOraSession.Select ( Text : string ;
                                const Params : array of variant ) : IGIOraQuery ;
var Query : TGIOraQuery ;
begin
  Query := TGIOraQuery.Create ( nil ) ;
  try
    Query.Session := Self ;
    InitQuery ( Query, Text, Params ) ;
    Query.Open ;
  except
    FreeAndNil ( Query ) ;
    raise ;
  end ;
  Result := Query ;
end ;

function TGIOraSession.ExecSQL ( Text : string ; const Params : array of variant ) : variant ;
begin
  Result := Null ;
  InitQuery ( FQuery, Text, Params ) ;
  FQuery.ExecSQL ;
end ;

function TGIOraSession.SelectValue ( SQLText : string ;
                                     const Params : array of variant ) : variant ;
begin
  Result := SelectValue ( SQLText, Params, Unassigned ) ;
end ;

function TGIOraSession.SelectValue ( SQLText : string ;
                                     const Params : array of variant ;
                                     Default : variant ) : variant ;
begin
  InitQuery ( FQuery, SQLText, Params ) ;
  FQuery.Open ;
  if FQuery.IsEmpty
    then Result := Default
    else Result := FQuery.Fields [ 0 ].Value ;
  FQuery.Close ;
end ;