Как изменить значение генератора с помощью фреймворка dbExpress без использования хранимых процедур?

Как изменить значение генератора с помощью фреймворка dbExpress? Я хочу изменить значение генератора напрямую с помощью dbExpress, без написания хранимой процедуры на стороне СУБД или т. д. Пожалуйста, помогите мне сделать это.


person Shaahin Ashayeri    schedule 08.12.2012    source источник
comment
Вы не можете выполнить команду ALTER SEQUENCE?   -  person TLama    schedule 08.12.2012
comment
Почему вы хотите изменить значение генератора: в целом это хороший способ напортачить в базе данных, которая активно используется.   -  person Mark Rotteveel    schedule 08.12.2012
comment
В моем приложении я хочу удалять все записи каждый день, а затем добавлять новые записи в мою таблицу и обновлять значение генератора (установленное на ноль).   -  person Shaahin Ashayeri    schedule 08.12.2012
comment
Поскольку генераторы находятся вне контроля над транзакциями, это не очень хорошая идея, если только вы не уверены, что существуют неодновременные действия, добавляющие новые записи.   -  person Mark Rotteveel    schedule 08.12.2012


Ответы (2)


AFAIK DBExpress не имеет класса, специализирующегося на работе с последовательностями/генераторами.

Вы по-прежнему можете использовать стандартный TSQLQuery, чтобы указать dbEngine изменить значение генератора, например:

procedure TMyDataModule.RestartMyGenerator;
begin
  Q := TSQLQuery.Create;
  try
    Q.SQLConnection := MyConnection;
    //compatible with firebird 1.x and 2.x
    //Q.SQL.Text := 'set generator mygenerator to 0';  
    //better alternative, but compatible only with firebird 2.x
    Q.SQL.Text := 'alter sequence mygenerator restart with 0';
    Q.ExecSQL;
  finally
    Q.Free;
  end;
end;

(непроверенный код, написанный прямо в этом окне)

person jachguate    schedule 08.12.2012

Функция с параметром TableName возвращает следующее значение генератора

function TDM.GenID(TableName: string): Integer;
var
  Qry: TSQLQuery;
begin
  Qry := TSQLQuery.Create(Self);
  try
    Qry.SQLConnection := SQLConnection;
    Qry.SQL.Add('SELECT GEN_ID(GEN_' + TableName + '_ID' + ', 1) ' +
                'FROM RDB$DATABASE');
    Qry.Open;
    Result := Qry.Fields[0].AsInteger;
  finally
    Qry.Free;
  end;
end;
person dataol    schedule 31.12.2012
comment
Настройте процедуру на имена ваших генераторов - person dataol; 01.01.2013
comment
извините за плохой английский - person dataol; 01.01.2013