/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MSSQL : Hvilket id fik det data set jeg li~
Fra : Kasper Kamp Simonsen


Dato : 26-08-02 13:42

Hej NG,

Jeg har brug for at vide hvilket id et dataset får når jeg har lavet en
INSERT INTO webtekst_tekst..........

Håber en af jer kan hjælpe mig.

Jeg bruger asp og MS SQL-Server 2000

/Kasper



 
 
Jens Gyldenkærne Cla~ (26-08-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 26-08-02 14:14

Kasper Kamp Simonsen skrev:

> Jeg har brug for at vide hvilket id et dataset får når jeg har
> lavet en INSERT INTO webtekst_tekst..........

SELECT @@IDENTITY as sidstIndsatId.

Du skal kalde den umiddelbart efter din insert-sætning for at være
sikker på at det er den rigtige værdi.

--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma
(rettelser modtages gerne i dk.kultur.sprog)

Mark S. Rasmussen (26-08-2002)
Kommentar
Fra : Mark S. Rasmussen


Dato : 26-08-02 18:37

> SELECT @@IDENTITY as sidstIndsatId.

Jeg laver lige et tillægsspørgsmål.

Jeg har ikke selv oplevet denne fejl, men kunne forestille mig at den kunne
ske. Hvis bruger 1 og 2 henter en asp side på næsten samme øjeblik. Kunne
man så ikke være ude for at bruger 1 først udfører en insert into kommando,
og så udfører bruger 2 den samme kommando, hvorefter bruger 1 henter det
sidste id, og får så et forkert id? hvorimod bruger 2 får det korrekte,
altså det han lige lavede?

Mvh Mark



Peter Lykkegaard (26-08-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 26-08-02 19:35

Mark S. Rasmussen <mark@tv.dk> skrev i en
nyhedsmeddelelse:akdov6$1kcs$1@news.cybercity.dk...
> > SELECT @@IDENTITY as sidstIndsatId.
>
> Jeg har ikke selv oplevet denne fejl, men kunne forestille mig at den
> kunne ske. Hvis bruger 1 og 2 henter en asp side på næsten samme
> øjeblik. Kunne man så ikke være ude for at bruger 1 først udfører en
> insert into kommando,
> og så udfører bruger 2 den samme kommando, hvorefter bruger 1 henter
> det sidste id, og får så et forkert id? hvorimod bruger 2 får det
korrekte,
> altså det han lige lavede?
>
Jeg vil sig absolut nej til dit spørgsmål
Select @@Identity _skal_ udføres i den samme SQL statement for at det virker
efter hensigten

mvh/Peter Lykkegaard





Jens Gyldenkærne Cla~ (26-08-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 26-08-02 19:55

Peter Lykkegaard skrev:

> Select @@Identity _skal_ udføres i den samme SQL statement for
> at det virker efter hensigten

Og bliver den det - enten via en lagret procedure eller via et SQL-
batch - kan den fejl Mark nævner ikke opstå. SQL-serveren sørger
selv for at isolere et batch fra omverdenen.

--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Mark S. Rasmussen (26-08-2002)
Kommentar
Fra : Mark S. Rasmussen


Dato : 26-08-02 20:06

> Jeg vil sig absolut nej til dit spørgsmål
> Select @@Identity _skal_ udføres i den samme SQL statement for at det
virker
> efter hensigten.

Så bliver jeg lige nødt til at spørge igen :). Jeg kan godt se hvordan det
kan klares med en stored procedure. Men hvis nu man laver en
Conn.Execute("Insert blahblahblah"), hvordan udfører jeg så select
@@identity? Skal jeg hente et ekstra recordset vha ; og .NextRecordSet,
eller skal jeg bare lave en ny Conn.Execute lige efter?

Mvh Mark



Jens Gyldenkærne Cla~ (26-08-2002)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 26-08-02 21:57

Mark S. Rasmussen skrev:

> Så bliver jeg lige nødt til at spørge igen :). Jeg kan godt se
> hvordan det kan klares med en stored procedure.

Så vil jeg anbefale at du laver det på denne måde.

> Men hvis nu man laver en Conn.Execute("Insert blahblahblah"),
> hvordan udfører jeg så select @@identity?

Som Peter skrev - i samme statement.

> Skal jeg hente et ekstra recordset vha ;

Ja.

> og .NextRecordSet,

Det skulle ikke være nødvendigt med .NextRecordSet så længe du bare
kører handlingsforespørgsler.

Prøv med noget i retning af

strSQL = "INSERT INTO foo (f1, f2) VALUES (v1, v2); INSERT INTO
foobar (f3, f4, f5) VALUES (@@IDENTITY, v3, v4);"

Jeg vil tro at det skulle virke, selvom jeg ikke er sikker på
hvordan en eventuel ny identityvalue i foobar håndteres.

De lærebogseksempler jeg har benytter en Stored Procedure og tre
trin (variabeldeklarationen regnes ikke som et trin):

DECLARE @idVar int
INSERT INTO foo (f1, f2) VALUES (v1, v2)
SELECT @idVAR = @@IDENTITY
INSERT INTO foobar (f3, f4, f5) VALUES (@idVar, v3, v4)


> eller skal jeg bare lave en ny Conn.Execute lige efter?

Nej. For SQL-serveren vil det se ud som to helt adskilte
forespørgsler og derfor give mulighed for det problem du beskrev.
Afhængig af hvor mange brugere du har og hvor hurtigt dine
forespørgsler kører kan denne metode (2 på hinanden følgende
conn.execute's) være god nok - men hvis du vil være sikker skal du
gøre noget andet (fx som ovenfor).

--
Jens Gyldenkærne Clausen
MF (medlem af FIDUSO - www.fiduso.dk)
I ovenstående tekst benyttes nyt komma.

Peter Lykkegaard (26-08-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 26-08-02 22:22


Mark S. Rasmussen <mark@tv.dk> skrev i en
nyhedsmeddelelse:akdu7a$1r10$1@news.cybercity.dk...
> > Jeg vil sig absolut nej til dit spørgsmål
> > Select @@Identity _skal_ udføres i den samme SQL statement for
> > at det virker efter hensigten.
>
> Så bliver jeg lige nødt til at spørge igen :). Jeg kan godt se hvordan det
> kan klares med en stored procedure. Men hvis nu man laver en
> Conn.Execute("Insert blahblahblah"),

Du kan fint bruge samme fremgangsmåde som i dine sp's
Erklæring af variabler, select gymnastik mv

> hvordan udfører jeg så select @@identity?
> Skal jeg hente et ekstra recordset vha ; og .NextRecordSet,

Hvis du ikke bruger Set NoCount, så kommer du sikker ud i at bruge
..NextRecordSet

> eller skal jeg bare lave en ny Conn.Execute lige efter?

_Nej_ - i samme SQL streng som du sender til MSSQL i eet metode/funktions
kald

mvh/Peter Lykkegaard



Jakob Møbjerg Nielse~ (27-08-2002)
Kommentar
Fra : Jakob Møbjerg Nielse~


Dato : 27-08-02 09:41

Mark S. Rasmussen wrote:
> Jeg har ikke selv oplevet denne fejl, men kunne forestille mig at den
> kunne ske. Hvis bruger 1 og 2 henter en asp side på næsten samme
> øjeblik. Kunne man så ikke være ude for at bruger 1 først udfører en
> insert into kommando, og så udfører bruger 2 den samme kommando,
> hvorefter bruger 1 henter det sidste id, og får så et forkert id?
> hvorimod bruger 2 får det korrekte, altså det han lige lavede?


Jo, hvis man ikke sørger for at låse applikationen først
(Application.Lock i ASP). I langt de fleste programmeringssprog der
understøtter tråde, kan man styre parallelliteten med semaforer. Jeg
kender ikke selv nogen hvor det ikke kan lade sig gøre.

I dette tilfælde ville jeg dog foretrække en SP. Det giver pænere
kildekode, og det bliver sværere at lave fejl.

--
Jakob Møbjerg Nielsen | "Five exclamation marks, the
jakob@dataloger.dk | sure sign of an insane mind."
http://www.jakobnielsen.dk/ | -- Terry Pratchett, Reaper Man
Jeg søger et fuldtidsjob som programmør. Tag et kig på hjemmesiden.



Mark S. Rasmussen (27-08-2002)
Kommentar
Fra : Mark S. Rasmussen


Dato : 27-08-02 17:13

> Jo, hvis man ikke sørger for at låse applikationen først
> (Application.Lock i ASP). I langt de fleste programmeringssprog der
> understøtter tråde, kan man styre parallelliteten med semaforer. Jeg
> kender ikke selv nogen hvor det ikke kan lade sig gøre.

Har Application.Lock ikke kun indflydelse på application() variablerne?

Mvh Mark



Jakob Møbjerg Nielse~ (28-08-2002)
Kommentar
Fra : Jakob Møbjerg Nielse~


Dato : 28-08-02 01:49

Mark S. Rasmussen wrote:
> Har Application.Lock ikke kun indflydelse på application()
> variablerne?

Jo, men jeg mener da at hvis Application.lock forsøges udført når en
anden process har låst den, så skal man vente til den anden process
udfører Application.Unlock, før man kommer videre.

FUT: dk.edb.internet.webdesign.serverside.asp

--
Jakob Møbjerg Nielsen | "Five exclamation marks, the
jakob@dataloger.dk | sure sign of an insane mind."
http://www.jakobnielsen.dk/ | -- Terry Pratchett, Reaper Man
Jeg søger et fuldtidsjob som programmør. Tag et kig på hjemmesiden.



Kasper Kamp Simonsen (27-08-2002)
Kommentar
Fra : Kasper Kamp Simonsen


Dato : 27-08-02 12:12

> SELECT @@IDENTITY as sidstIndsatId.
>
> Du skal kalde den umiddelbart efter din insert-sætning for at være
> sikker på at det er den rigtige værdi.

Mange tak for svaret, det virker som det skal :)

/Kasper



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste