Toon posts:

[ASP/SQL] Auto_Id Achterhalen

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

Verwijderd

Topicstarter
Beste tweakers,

Is het mogelijk om van een uitgevoerde RecordSet het automatisch id (SQL_AutoIncrement) record te herleiden zonder een nieuwe recordset te starten?

Ik heb hier niks hierover kunnen vinden, misschien zoek ik verkeerd....

In ieder geval bedankt

  • Xion
  • Registratie: November 2000
  • Laatst online: 22-08 17:51
Ik vind je vraag nogal vaag, wat bedoel je met een 'uitgevoerde RecordSet'?

Je bedoelt de ID van een record die je geinsert hebt?

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 10:39

Janoz

Moderator Devschuur®

!litemod

Dat is afhankelijk van de gebruikte database. Over het algemeen is dit opgeslagen in een variabele. Bij MSSQL is dat bijvoorbeeld iets van @@identity.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Je kunt , na een insert van een record dat een autonummer veld heeft, het gegenereerde ID gaan ophalen dmv
code:
1
select @@identity

te doen.

Je zult dan idd 2x iets moeten laten uitvoeren door de DB, nl. het inserten, en het ophalen van het ID.
Je kunt dit echter in 1x doen door gebruik te maken van stored procedures. In die stored procedure ga je dan dus zowel de insert doen als de id ophalen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Xion schreef op 20 mei 2003 @ 11:27:
Ik vind je vraag nogal vaag, wat bedoel je met een 'uitgevoerde RecordSet'?

Je bedoelt de ID van een record die je geinsert hebt?
yes...

Verwijderd

Topicstarter
[quote]whoami schreef op 20 May 2003 @ 11:27:
Je kunt , na een insert van een record dat een autonummer veld heeft, het gegenereerde ID gaan ophalen dmv
code:
1
select @@identity

te doen.


Klinkt goed...

Maar ik begrijp m nog niet helemaal:

code:
1
2
3
4
set rs = Server.Create Blabla
  insertstring = "SQL CODE"
  Identity  = "SELECT @@identity"
rs.Execute(insertstring)


Ik krijg een foutmelding als ik beide strings laat uitvoeren.
( Invalid property Assignment 'rs')

En als ik ze los uitvoer hebben ze geen betrekking meer op elkaar
(weer een foutmelding)


Hoe krijg ik 'm er dan uit?

[ Voor 12% gewijzigd door Verwijderd op 20-05-2003 16:41 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik zou het in een SP (Stored Procedure) doen. Je kunt dan een transactie starten, inserten, @@Identity ophalen en je trasactie commiten (of roll-backen). Anders bestaat het gevaar dat je de @@Identity krijgt van iemand die een insert net na de jouwe doet... En dat wil je al helemaal niet. De kans is klein, ik weet het, maar hij is er wel! ;)

Ga ik er dus wel van uit dat je MSSQL gebruikt, maar daar ben je niet heel erg duidelijk in...

edit:

Ik ga effe een voorbeeld uit een bestaande DB voor je halen...


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
CREATE PROCEDURE [sp_UpdateUser]
    @intID as int,
    @strName as varchar(25),
    @strPass as varchar(25),
    @intUTID as int,
    @intCUID as int,
    @strEmail as varchar(150),
    @bActive as bit,
    @bNotify as bit,
    @bNotifyNew as bit
    
AS

SET nocount ON

DECLARE @intNEWID as int

BEGIN TRANSACTION 
IF @intID>0 
BEGIN
    IF (Select Count(us_id) from tbl_Users where (us_name=@strName) and (us_id<>@intID))=0
    BEGIN
        SET @intNEWID = @intID
        UPDATE tbl_Users Set
            us_Name = @strName,
            us_Password = @strPass,
            us_ut_id = @intUTID,
            us_cu_id = @intCUID,
            us_Email = @strEmail,
            us_Active = @bActive,
            us_EmailNotify = @bNotify,
            us_EmailNotifyNew = @bNotifyNew
        Where us_ID = @intID
        IF @@error <> 0 GOTO _error
    END
    ELSE SET @intNEWID = -2 --User exists already!
END
ELSE
BEGIN
    IF (Select Count(us_id) from tbl_Users where us_name=@strName)=0
    BEGIN
        INSERT INTO tbl_Users (
            us_Name, us_Password, us_ut_id, us_cu_id, us_Email, us_Active, us_EmailNotify, us_EmailNotifyNew
    
        ) VALUES (
            @strName, @strPass, @intUTID, @intCUID, @strEmail, @bActive, @bNotify, @bNotifyNew
        )
        IF @@error <> 0 GOTO _error
        SET @intNEWID = @@IDENTITY
    END
    ELSE SET @intNEWID = -2 --User exists already!
END

_exit:
BEGIN
    COMMIT TRANSACTION
    set nocount off
    SELECT @intNEWID AS success
    RETURN
END
_error:
BEGIN
    ROLLBACK TRANSACTION
    set nocount off
    SELECT -1 AS success
    RETURN
END
GO


Deze SP insert een user als het ID<=0, Update de user als het ID>0 en geeft het nieuwe ID terug. (-1 = Fout bij uitvoeren SP, -2 = User bestaat al)...

[ Voor 73% gewijzigd door RobIII op 20-05-2003 11:52 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
:?
Ik snap je niet helemaal.

Je doet toch eerst een insert ?
Je SQL statement ziet er dan als volgt uit bv:
code:
1
INSERT INTO tabel (blaa) VALUES (blaat)

Dit voer je uit.

Daarna doe je een SELECT @@identity
(Voor die select moet je dan dus wel een recordset gebruiken)

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
RobIII schreef op 20 May 2003 @ 11:49:
Ik zou het in een SP (Stored Procedure) doen. Je kunt dan een transactie starten, inserten, @@Identity ophalen en je trasactie commiten (of aborten). Anders bestaat het gevaar dat je de @@Identity krijgt van iemand die een insert net na de jouwe doet... En dat wil je al helemaal niet. De kans is klein, ik weet het, maar hij is er wel! ;)

Ga ik er dus wel van uit dat je MSSQL gebruikt, maar daar ben je niet heel erg duidelijk in...

edit:

Ik ga effe een voorbeeld uit een bestaande DB voor je halen...
Voor zover ik weet, is de @@identity beperkt tot je eigen sessie. Je kunt dus nooit het id terugkrijgen van een record dat iemand anders heeft geinserted.
De @@identity returned het id van het laatste geinserte record binnen de huidige session-scope.

https://fgheysels.github.io/


Verwijderd

Topicstarter
RobIII schreef op 20 mei 2003 @ 11:49:


Ga ik er dus wel van uit dat je MSSQL gebruikt, maar daar ben je niet heel erg duidelijk in...

edit:

Ik ga effe een voorbeeld uit een bestaande DB voor je halen...
Sorry! Ik gebruik MySQL!!
Was ik ff vergeten 8)7

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Verwijderd schreef op 20 mei 2003 @ 11:51:
[...]


Sorry! Ik gebruik MySQL!!
Was ik ff vergeten 8)7
select LAST_INSERT_ID()


(was niet erg moeilijk te vinden btw:
http://www.mysql.com/doc/en/example-AUTO_INCREMENT.html
)

[ Voor 23% gewijzigd door Erkens op 20-05-2003 11:54 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
:/

Ook goed dan, dan ben je niets met die @@identity. Die is specifiek voor MS databases.

https://fgheysels.github.io/


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:39

TeeDee

CQB 241

simpel voorbeeldje dan maar :)

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
Set cmdpersoneel = CreateObject("ADODB.Connection")
cmdpersoneel.Open (ConnSTRING)
sqlInsert = "INSERT INTO dbo.tblPersoneel (v_naam, a_naam)  VALUES ("&sqlvalues&")"
cmdpersoneel.Execute(sqlInsert)
' Haal het Id op! Om te inserten in de Order database!
sqlselect = "SELECT @@IDENTITY AS persID"
 
 Set rspers = cmdpersoneel.Execute(sqlselect)
 persID = rspers("persID")

' sluiten!
cmdpersoneel.Close()
Set cmdpersoneel = Nothing


hmm, mySql :) was te laat dus :)

[ Voor 14% gewijzigd door TeeDee op 20-05-2003 11:55 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • DeverauX
  • Registratie: Februari 2002
  • Niet online

DeverauX

Focus is everything

Sorry! Ik gebruik MySQL!!
Was ik ff vergeten
In dat geval kan je gewoon gebruik maken van de functie last_insert_id :)

...whatever was distasteful or unpleasant or uncomfortable or painful - music could always soothe that.
All you have to do is reach out to beauty.
Quincy Jones


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
whoami schreef op 20 mei 2003 @ 11:51:
[...]


Voor zover ik weet, is de @@identity beperkt tot je eigen sessie. Je kunt dus nooit het id terugkrijgen van een record dat iemand anders heeft geinserted.
De @@identity returned het id van het laatste geinserte record binnen de huidige session-scope.
hmmm... uit T-SQL help:
@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the current session. However, SCOPE_IDENTITY returns the value only within the current scope; @@IDENTITY is not limited to a specific scope.

IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT returns the identity value generated for a specific table in any session and any scope. For more information, see IDENT_CURRENT.

The scope of the @@IDENTITY function is the local server on which it is executed. This function cannot be applied to remote or linked servers. To obtain an identity value on a different server, execute a stored procedure on that remote or linked server and have that stored procedure, which is executing in the context of the remote or linked server, gather the identity value and return it to the calling connection on the local server.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Wel, het staat daar toch:
@@IDENTITY and SCOPE_IDENTITY will return the last identity value generated in any table in the current session

https://fgheysels.github.io/


  • BasSpruit
  • Registratie: September 2002
  • Laatst online: 09-04-2022
wat wel voor elke DB werkt: een select uitvoeren met de gegevens die je in je INSERT gebruikt. werkt altijd :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
whoami schreef op 20 mei 2003 @ 11:57:
Wel, het staat daar toch:


[...]
Ik ontkracht je bewering toch ook niet? Ik lever zelfs "bewijsmateriaal" voor je aan... 8)7

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

whoami schreef op 20 mei 2003 @ 11:57:
Wel, het staat daar toch:


[...]
mja, maar met @@identity zit je alleen nog wel met de scope kwestie (evt. triggers kunnen ook nog inserts uitvoeren).

Today's subliminal thought is:


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

ChaosDream schreef op 20 May 2003 @ 11:58:
wat wel voor elke DB werkt: een select uitvoeren met de gegevens die je in je INSERT gebruikt. werkt altijd :)
nee hoor ;)
dat ligt helemaal aan je tabel, en vroeg of laat zal dit fout gaan ;)
helemaal als er op je primairy key na geen unieke velden zijn.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Annie schreef op 20 May 2003 @ 14:23:
[...]

mja, maar met @@identity zit je alleen nog wel met de scope kwestie (evt. triggers kunnen ook nog inserts uitvoeren).
Idd, en daar heb je de scope_identity voor. :Y)

https://fgheysels.github.io/


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

whoami schreef op 20 May 2003 @ 14:32:
[...]
Idd, en daar heb je de scope_identity voor. :Y)
offtopic:
joh, echt? :+ ;)

Today's subliminal thought is:


  • mocean
  • Registratie: November 2000
  • Laatst online: 15-08 04:26
Voordat ik wat meer van MySQL wist deed ik wel eens:
"SELECT max(id) AS newid FROM tablename"

Dan heb je m meestal wel :)

Koop of verkoop je webshop: ecquisition.com


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 13:39

TeeDee

CQB 241

mocean schreef op 20 mei 2003 @ 18:29:
Voordat ik wat meer van MySQL wist deed ik wel eens:
"SELECT max(id) AS newid FROM tablename"

Dan heb je m meestal wel :)
Hmm, ja, dat is leuk: Moet je eens op GoT proberen :)
Dat werkt leuk voor een website met 1 bezoeker per uur. Maar als 2 bezoekers tegelijkertijd wat inserten, dan heb je al een probleem :)

Heart..pumps blood.Has nothing to do with emotion! Bored

Pagina: 1