[ASP.NET/SQL] Database Insert met row ID als antwoord

Pagina: 1
Acties:

  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
Ik heb een functie gemaakt in een asp.net script, waar een rij aan tabel Photos wordt toegevoegd. Nu heeft tabel Photos een kolom PhotoID. Ik wil na het toevoegen van een rij de waarde van PhotoID als antwoord hebben.
Dit los ik op dit moment op met onderstaande functie:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Function AddPhoto (blabla)
    Dim objConnection As SqlConnection
    objConnection = New SqlConnection("blabla;")
    Dim objCommand As SqlCommand = New SqlCommand()
    objCommand.Connection = objConnection
        
    objCommand.CommandText = "INSERT INTO Photos VALUES blabla"_
    & chr(10) & "SELECT MAX(PhotoID) FROM Photos"
    
    objConnection.Open()
    Dim PhotoID as Integer = objCommand.ExecuteScalar()
    objConnection.close()
    Return PhotoID
End Function

Nu denk ik dat 'SELECT MAX(PhotoID) FROM Photos' meer processortijd vraagt van sql server dan dat nodig is.

Bij het 'oude' asp kon je het op de volgende manier oplossen:
code:
1
2
3
4
5
6
7
strSQL = "SELECT * FROM blabla;"
objRecordset.Open strSQL, DB_CONNECTIONSTRING, adOpenKeyset,_
adLockPessimistic, adCmdText
objRecordset.AddNew
objRecordset.Fields("blabla") = blabla
objRecordset.Update
PhotoID = objRecordset.Fields("PhotoID").Value

Ik heb gezocht met Google en hier, maar alle database insert oplossingen op internet werken met datagrids en zo.

Hoe kan ik een zelfde soort methode toepassen in asp.net zoals het in het 'oude' asp werd gedaan?

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Swerfer schreef op 21 december 2003 @ 17:27:
Ik heb een functie gemaakt in een asp.net script, waar een rij aan tabel Photos wordt toegevoegd. Nu heeft tabel Photos een kolom PhotoID. Ik wil na het toevoegen van een rij de waarde van PhotoID als antwoord hebben.
Dit los ik op dit moment op met onderstaande functie:
Nu denk ik dat 'SELECT MAX(PhotoID) FROM Photos' meer processortijd vraagt van sql server dan dat nodig is.
Een SELECT MAX() heeft het hoogste id terug, en dat hoeft niet altijd het ID te zijn van het record dat jij als laatste toegevoegd hebt.

SQL Server heeft bepaalde functies om het laatst geinserte ID uit een tabel terug te geven; nl. @@identity, scope_identity() en ident_current().
Check even in de help van Sql Server welke functie er voor jou het meest geschikt is.
Ik denk dat scope_identity() in jouw geval het best is, aangezien die functie gelimiteerd is tot de huidige sessie.

code:
1
SELECT scope_identity() FROM tabel
dus bv.

Om het heel veilig te spelen, maak je misschien best een stored procedure, die de insert voor jou gaat gaan doen, en die ook het id gaat gaan teruggeven.
Bv:
code:
1
2
3
4
5
6
7
8
9
10
CREATE PROCEDURE  insert_myrecord( @p_naam    VARCHAR(25),
                                                              @p_id          INT OUTPUT)
AS
BEGIN

  INSERT INTO mijntabel (naam) VALUES (@p_naam)

  SELECT @p_id = scope_identity FROM mijntabel

END


Het is trouwens niet de processortijd die de grootste bottleneck is voor een databank

https://fgheysels.github.io/


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
whoami schreef op 21 december 2003 @ 17:32:
[...]

Een SELECT MAX() heeft het hoogste id terug, en dat hoeft niet altijd het ID te zijn van het record dat jij als laatste toegevoegd hebt.
Daar had ik ook nog niet aan gedacht |:(
Ik denk dat scope_identity() in jouw geval het best is, aangezien die functie gelimiteerd is tot de huidige sessie.

code:
1
SELECT scope_identity() FROM tabel
dus bv.

Om het heel veilig te spelen, maak je misschien best een stored procedure, die de insert voor jou gaat gaan doen, en die ook het id gaat gaan teruggeven.
Ik ga hiermee aan de gang... Lijkt me inderdaad een goede oplossing...

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
De scope_identity functie returned de laatste waarde die in een identity column geinsert werd binnen dezelfde sessie.
Dat wil dus zeggen dat je normaal gezien wel het id terugkrijgt van het record dat jij als laatste in die tabel geinsert hebt.
Echter, stel dat er een trigger bestaat op die tabel, en die trigger doet een insert in een andere tabel (tabel X), dan krijg je het id terug van het record dat geinsert werd in tabel X.

https://fgheysels.github.io/


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
whoami schreef op 21 december 2003 @ 17:42:
De scope_identity functie returned de laatste waarde die in een identity column geinsert werd binnen dezelfde sessie.
Dat wil dus zeggen dat je normaal gezien wel het id terugkrijgt van het record dat jij als laatste in die tabel geinsert hebt.
Echter, stel dat er een trigger bestaat op die tabel, en die trigger doet een insert in een andere tabel (tabel X), dan krijg je het id terug van het record dat geinsert werd in tabel X.
Er zit wel een trigger op de desbetreffende tabel, maar dat is een update trigger.

Krijg ik dan wel het gewenste ID terug?

edit:
Die trigger updates een andere tabel...

[ Voor 5% gewijzigd door Swerfer op 21-12-2003 17:49 ]

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 15:14
Swerfer schreef op 21 december 2003 @ 17:47:
[...]


Er zit wel een trigger op de desbetreffende tabel, maar dat is een update trigger.

Krijg ik dan wel het gewenste ID terug?

edit:
Die trigger updates een andere tabel...
Ja.

Lees ff de informatie erover in de BOL van SQL Server. Daar vind je alles in terug.
scope_identity returned nl. de waarde van de laatst geinserte identity column binnen de current session.

https://fgheysels.github.io/


  • Swerfer
  • Registratie: Mei 2003
  • Laatst online: 26-05 22:09
whoami schreef op 21 december 2003 @ 18:24:
[...]


Ja.

Lees ff de informatie erover in de BOL van SQL Server. Daar vind je alles in terug.
scope_identity returned nl. de waarde van de laatst geinserte identity column binnen de current session.
Ik heb nu een procedure gemaakt die werkt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE PROCEDURE AddPhoto
    (
    @UserID INT,
    @AlbumID INT,
    @PhotoLocationID INT,
    @PhotoName NVARCHAR(50),
    @PhotoType CHAR(3),
    @PhotoDescription NVARCHAR(500)
    )
    AS
    INSERT INTO Photos (blabla) VALUES (blabla)
    SELECT SCOPE_IDENTITY()
GO

Bedankt! :)

Home Assistant | Unifi | LG 51MR.U44 | Volvo EX30 SMER+ Vapour Grey, trekhaak | SmartEVSE V3 | Cronos Crypto.com

Pagina: 1