[Delphi] [MsAccess] - id ostatnio dodanego rekordu.

0

Witam,
W jaki sposób uzyskać 'id' ostatnio dodanego rekordu do bazy MS Access.

tabela users ma pola (id, imie, nazwisko), id jest oczywiście kluczem, 'autoincrement'.

Rekord dodaję obecnie następująco:

ADOCommand.CommandText := 'INSERT INTO users (imie, nazwisko) VALUES (:imie, :nazwisko);'

with ADOCommand.Parameters do begin
    ParamByName('imie').Value   := 'Jan';
    ParamByName('nazwisko').Value := 'Kowalski';
end;

ADOCommand.Execute();

Wszystko ładnie działa.

Doczytałem w sieci, że ID ostatnio dodanego rekordu w MS Access jest otrzymywane przez SELECT @@IDENTITY dodane
zaraz za zapytaniem.

Jednak:

ADOCommand.CommandText := 'INSERT INTO users (imie, nazwisko) VALUES (:imie, :nazwisko); SELECT @@IDENTITY;'

Powoduje błąd: "Po końcu instrukcji SQL znaleziono znaki."

Próbowałem użyć ADODataSet (zwraca wynik) zamiast ADOCommand

ADODataSet.CommandText := 'INSERT INTO users (imie, nazwisko) VALUES (:imie, :nazwisko); SELECT @@IDENTITY;'

with ADODataSet.Parameters do begin
    ParamByName('imie').Value   := 'Jan';
    ParamByName('nazwisko').Value := 'Kowalski';
end;

ADODataSet.Open;

Komunikat z błędem taki sam: "Po końcu instrukcji SQL znaleziono znaki."

Tutaj jednak bez 'SELECT @@IDENTITY' otrzymuję również inny błąd:
"ADODataSet: CommandText does not return a result set."

czyli trop dobry - zwraca mi się wynik dzięki 'SELECT @@IDENTITY'

tylko jak go użyć i zapisać w zmiennej? i jak zlikwidować błąd "Po końcu instrukcji SQL znaleziono znaki."

Dzięki za wszelkie sugestie. Pozdrawiam.

0

ja [CIACH!]...

with ADOCommand, Parameters do 
begin
  CommandText := 'INSERT INTO users (imie, nazwisko) VALUES (:imie, :nazwisko);'
  ParamByName('imie').Value   := 'Jan';
  ParamByName('nazwisko').Value := 'Kowalski';
  Execute();
end;

with ADOCommand do 
begin
  CommandText := 'SELECT @@IDENTITY;'
  Open;  
end;

takie to trudne rozbić na DWA zapytania??

0

Dzięki za odpowiedź. tak spróbuję to zrobić.

tam ma być 'Open' czy 'Execute' ?

Pytanie mam jeszcze jedno. Jak zapisać wynik z zapytania 'SELECT @@IDENTITY' do zmiennej, np. lastid (integer) ?

Pozdrawiam

0

poczytaj w helpie czym się różni open od execute i kiedy które się używa.

Co do odczytania to

with ADOCommand do 
begin
  CommandText := 'SELECT @@IDENTITY AS id;'
  Open;  
  lastid := FieldByName('id').AsInteger;
end;
0

Hmm...

TADOCommand does not contain a member named 'Open' ...
TADOCommand does not contain a member named 'FieldByName' ...

Coś nie tak robię ?

Dobra poradziłem sobie :), ostatnie ID zwraca mi:

          with ADODataSet do
          begin
            CommandText := 'SELECT @@IDENTITY AS id;';
            Open;
            lastid := FieldByName('id').AsInteger;
          end;

Rekord dodaje przy użyciu ADOCommand
A ostatnie ID sprawdzam przy użyciu ADODataSet

Dzięki za nakierowanie.
Pozdrawiam

0

zamień ADOCommand na ADODataSet

1 użytkowników online, w tym zalogowanych: 0, gości: 1