[Delphi] autoincrement van laatste INSERT-query opvragen

Pagina: 1
Acties:
  • 130 views sinds 30-01-2008
  • Reageer

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20-04 07:00
Is het in Delphi (7.0) mogelijk om de waarde van de primary key van het laatst toegevoegde record in de (Access-)database te achterhalen zonder een nieuwe SELECT-query erop los te laten? Ik gebruik de ADO-functies om e.e.a. aan de database toe te voegen:

code:
1
2
ADOCommand.CommandText := 'INSERT INTO tbl (var1, var2) VALUES ("val1", "val2")';
ADOCommand.Execute;

in bovenstaand voorbeeld heeft de tabel 'tbl' dus nog een derde AutoNumber-veld ID. Kortgezegd zoek ik dus een Delphi-kloon van de PHP-functie mysql_insert_id.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:02
Wat doet mysql_insert_id ? Die zal toch ook wel op een of andere manier een select gaan doen.

Vziw is het enkel mogelijk om de laatste identity op te vragen (in access) dmv een select @@identity

https://fgheysels.github.io/


  • HyperioN
  • Registratie: April 2003
  • Laatst online: 20-02 21:06
Weet niet precies het verband tussen ADO en ODBC (ken Delphi niet goed), maar misschien dat je hier wat aan hebt:
http://dev.mysql.com/doc/...c-and-last-insert-id.html

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Als je de OLE DB4 Driver gebruikt kun je volgens mij het volgende doen:
code:
1
CommandText := 'INSERT INTO tbl (var1, var2) VALUES ("val1", "val2")';SELECT @@IDENTITY"


msdn linkje

[ Voor 10% gewijzigd door P_de_B op 21-11-2005 13:36 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20-04 07:00
Dank! Ik heb het opgelost met een SELECT @@IDENTITY AS new_id.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
sjroorda schreef op maandag 21 november 2005 @ 13:58:
Dank! Ik heb het opgelost met een SELECT @@IDENTITY AS new_id.
Hou wel rekening met concurrency issues als je het niet in 1 transactie doet, je kunt in theorie het id van een record krijgen die door een andere gebruiker is toegevoegd.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • sjroorda
  • Registratie: December 2001
  • Laatst online: 20-04 07:00
Dat is hier niet aan de orde, maar dank voor de waarschuwing. Het is echt 1 op zichzelf staande query.

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:02
P_de_B schreef op maandag 21 november 2005 @ 13:59:
[...]


Hou wel rekening met concurrency issues als je het niet in 1 transactie doet, je kunt in theorie het id van een record krijgen die door een andere gebruiker is toegevoegd.
@@identity houd rekening met sessies. Je kunt dus niet het id krijgen van het record dat een andere gebruiker heeft geinserted. Je krijgt het id dat in jouw sessie als laatst geinserted werd. Dit wil wel zeggen dat, als je een record in tabel A insert (waarbij tabel A een identity column heeft), en tabel A heeft een ON INSERT trigger, die een record insert in tabel B (die ook een identity column heeft), je het ID terug krijgt van het record in tabel B, en niet het id van het record in tabel A.

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op maandag 21 november 2005 @ 14:10:
[...]


@@identity houd rekening met sessies. Je kunt dus niet het id krijgen van het record dat een andere gebruiker heeft geinserted. Je krijgt het id dat in jouw sessie als laatst geinserted werd. Dit wil wel zeggen dat, als je een record in tabel A insert (waarbij tabel A een identity column heeft), en tabel A heeft een ON INSERT trigger, die een record insert in tabel B (die ook een identity column heeft), je het ID terug krijgt van het record in tabel B, en niet het id van het record in tabel A.
Hmm, daar heb je natuurlijk gelijk in. Het zal idd wel hetzelfde werken als SQL Server.

Om nog maar iets nuttigs toe te voegen, in situaties met een trigger kun je dan beter SCOPE_IDENTITY() gebruiken.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Laatst online: 11:02
P_de_B schreef op maandag 21 november 2005 @ 14:12:
[...]

Om nog maar iets nuttigs toe te voegen, in situaties met een trigger kun je dan beter SCOPE_IDENTITY() gebruiken.
Ja, maar dat heb je niet in Access. :)
(Wat ook niet nodig is, aangezien Access geen triggers kent :P )

https://fgheysels.github.io/

Pagina: 1