Avatar billede zetn Nybegynder
22. juni 2004 - 13:52 Der er 19 kommentarer og
1 løsning

Unik id

Heysa

Jeg er ved at lave en side hvor jeg smider nogle informationer ind i en database, men lige før de bliver smidt ind i databasen skal der oprettes et unikt id som ikke findes i databasen i forvejen. Gerne på 4-8 tegn.

Hvordan laver jeg dette?

/zetn
Avatar billede fennec Nybegynder
22. juni 2004 - 13:54 #1
Kan du ikke bruge databasens autonummer funktion???
Avatar billede zetn Nybegynder
22. juni 2004 - 13:56 #2
Nej for så skal jeg bagefter udtrække data fra databasen udfra de felter der blev udfyldt. Hvis jeg kan genere en unik kode før, kan jeg kalde dataerne med det samme.
Avatar billede fennec Nybegynder
22. juni 2004 - 14:02 #3
Du kan jo hente det sidste indsatte autonummer ud fra databasen, så du kan hente alle data ud igen. Ofte gøres det med "SELECT @@IDENTITY AS THISID" i forskellige former afhængig af database type.

Problemet er at du ikke kan generere en kode der er unik, uden at skal til at tjekke det med databasen igen og igen. Så det vil være bedst at bruge autonummer funktionen. Hvilken database kører du med???
Avatar billede zetn Nybegynder
22. juni 2004 - 14:04 #4
access - grunden til det er, hvis du nu tager sidste indsatte autonr. i databasen, hva så hvis der nu er 2 brugere der smider noget ind samtidig?
Avatar billede fennec Nybegynder
22. juni 2004 - 14:23 #5
Sandsynligheden for det er meget lille. Koden bliver jo eksikveret på milisekunder.
Avatar billede ldanielsen Nybegynder
22. juni 2004 - 14:26 #6
Hvis du eksekverer indenfor den samme transaction er du helt sikker.

Con.Begintrans

blabla ...

Con.CommitTrans
Avatar billede zetn Nybegynder
22. juni 2004 - 14:27 #7
Kan du uddybe det udtryk? - kender det ikke lige..
Avatar billede ldanielsen Nybegynder
22. juni 2004 - 14:38 #8
En transaction er en slags beskyttelse mod netop det du beskriver, samtidige opdateringer. Hvis en proces kører indenfor en transaction, så er det kun den ene bruger der kan ændre data imens.

Det betyder naturligvis at du skal sørge for at transactions sluttes, ellers låses dele af databasen.

Jeg tror du skal læse om det selv, jeg er ikke helt sikker på hvordan det foregår omkr. access.
Avatar billede erikjacobsen Ekspert
22. juni 2004 - 14:50 #9
Du behøver ikke transaktioner til lige netop dette (men i andre tilfælde!)
Når blot du ikke lukker din connection mellem "INSERT ..." og "SELECT @@IDENTITY AS THISID"
får du det rigtige svar, også selv om der er flere brugere.

Det gælder dig ikke nødvendigvis hvis du bruger MSSQL med triggers der laver
nye INSERTs - men det gør du jo ikke ;)
Avatar billede zetn Nybegynder
22. juni 2004 - 14:52 #10
Så lige efter jeg har indsat noget i databasen skal jeg bruge:

strSQL = "SELECT @@IDENTITY AS THISID"
set rs = conn.execute(strSQL)

eller hva?

og til sidst lukke forbindelsen.
Avatar billede fennec Nybegynder
22. juni 2004 - 15:00 #11
Jeps. Sådan plejer jeg at gøre det.

Jeg har dog altid troet, at det var muligt for en bruger at indsætte, i tiden mellem de to linjer bliver eksiveret af en anden bruger (meget lille mulighed). Men det ved erikjacobsen og ldanielsen sikkert mere om....
Avatar billede zetn Nybegynder
22. juni 2004 - 15:06 #12
Får denne fejl:

Elementet kan ikke findes i den samling, der svarer til det anmodede navn eller ordenstal.
redirect.asp, line 25

når jeg prøver denne sætning lige efter at have smidt noget i en database:

strSQL = "SELECT @@IDENTITY AS THISID"
set ri = conn.execute(strSQL)

session("efterlysid") = ri("id")
Avatar billede fennec Nybegynder
22. juni 2004 - 15:08 #13
ri("THISID")
Avatar billede zetn Nybegynder
22. juni 2004 - 15:12 #14
Cool :)

Smid et svar både erik og fennec!
Avatar billede fennec Nybegynder
22. juni 2004 - 15:14 #15
ok :o)
Avatar billede erikjacobsen Ekspert
22. juni 2004 - 15:15 #16
Tak, men jeg samler slet ikke på point.
Avatar billede zetn Nybegynder
22. juni 2004 - 15:16 #17
fair nok, så får fennec dem bare :)
Avatar billede fennec Nybegynder
22. juni 2004 - 15:19 #18
Det kan være du så ved om access kan trække id'et ud samtidig med indsættelsen, som man kan i MSSQL med:

"SET NOCOUNT ON;insert into MinTabel (navn, add) values('fennec', 'Denne Vej 2'); SELECT @@IDENTITY AS THISID;"
Avatar billede ldanielsen Nybegynder
22. juni 2004 - 19:23 #19
erikjacobsen > Tak for kommentaren, det var lige det jeg ikke turde påstå. Jeg mente nok at der også for Access er en automatisk transaction for en connections levetid. Det er måske standard for ado uanset driver?

Endnu en grund til at huske at lukke sin connection, ellers commit'er transaction'en vel først når connection'en får timeout
Avatar billede erikjacobsen Ekspert
22. juni 2004 - 19:26 #20
Nej, det er ikke derfor man skal lukke sin forbindelse. Hver sql-sætning
udføres som den står, når man ikke blander transaktioner ind i det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester