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

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Id for det som lige er tilføjet til Access~
Fra : Anders


Dato : 04-11-02 13:16

Jeg skal bruge noget kode der kan fortælle det id nummer på rækken, som lige
er blevet tilføjet.

Det virker ikke optimalt, at bruge SELECT Max(id) as maxid FROM .....

Fordi så fortæller den bare nummeret på den der tidligere var den højeste
værdi og der virker heller ikke, hvis jeg undersøger Max(id) før jeg
tilføjer til databasen og derefter lægger en til, for så vil det give et
forkert resultat, hvis det id der tidligere var størst er blevet slettet i
databasen.

Hvad gør jeg?

Mvh. Anders



 
 
Chrisser (04-11-2002)
Kommentar
Fra : Chrisser


Dato : 04-11-02 13:26

"Anders" <anders@no-mail.com> skrev i en meddelelse
news:aq5oni$85c$2@sunsite.dk...
> Jeg skal bruge noget kode der kan fortælle det id nummer på rækken, som
lige
> er blevet tilføjet.
>
> Det virker ikke optimalt, at bruge SELECT Max(id) as maxid FROM .....
>
> Fordi så fortæller den bare nummeret på den der tidligere var den højeste
> værdi

Hvorfor det ?
Hvis du henter den efter at du har tilføjet en (og eksekveret din
tilføjelse), vil jeg da mene at du får den der lige er tilføjet.....

MVH
Chrisser



Jesper Stocholm (04-11-2002)
Kommentar
Fra : Jesper Stocholm


Dato : 04-11-02 13:41

Chrisser wrote :

> "Anders" <anders@no-mail.com> skrev i en meddelelse
> news:aq5oni$85c$2@sunsite.dk...
>> Jeg skal bruge noget kode der kan fortælle det id nummer på rækken,
>> som lige er blevet tilføjet.
>>
>> Det virker ikke optimalt, at bruge SELECT Max(id) as maxid FROM .....
>>
>> Fordi så fortæller den bare nummeret på den der tidligere var den
>> højeste værdi
>
> Hvorfor det ?
> Hvis du henter den efter at du har tilføjet en (og eksekveret din
> tilføjelse), vil jeg da mene at du får den der lige er tilføjet.....

Hvis et site har *mange* brugere, så kan man ikke altid være _sikker_ på,
at det største id er det sidst indsatte. Andre kunne jo have enten
slettet eller tilføjet nye rækker i din tabel i mellemtiden - omend der
nok skal være mange brugere før det bliver et reelt problem. Hvis man i
Access bruger tilfældige IDs, så kan man heller ikke bruge MAX(id)-
metoden.



--
Jesper Stocholm
http://stocholm.dk
Ny FAQ for dk.edb.internet.webdesign.serverside.asp
se http://asp-faq.dk

Chrisser (04-11-2002)
Kommentar
Fra : Chrisser


Dato : 04-11-02 13:45

"Jesper Stocholm" <jespers@stocholm.invalid> skrev i en meddelelse
news:Xns92BC8B175F662spamstocholmdk@130.226.1.34...
> >
> > Hvorfor det ?
> > Hvis du henter den efter at du har tilføjet en (og eksekveret din
> > tilføjelse), vil jeg da mene at du får den der lige er tilføjet.....
>
> Hvis et site har *mange* brugere, så kan man ikke altid være _sikker_ på,
> at det største id er det sidst indsatte. Andre kunne jo have enten
> slettet eller tilføjet nye rækker i din tabel i mellemtiden - omend der
> nok skal være mange brugere før det bliver et reelt problem.

Der er jo muligheden for at låse databasen imellemtiden....

>Hvis man i
> Access bruger tilfældige IDs, så kan man heller ikke bruge MAX(id)-
> metoden.
>

Nej, det kan du have fuldstændig ret i.....

Chrisser




Anders (04-11-2002)
Kommentar
Fra : Anders


Dato : 04-11-02 14:03

"Chrisser" <cbj@egdatainform.dk> skrev i en meddelelse
news:aq5q7e$ea3$1@sunsite.dk...
> > Hvis et site har *mange* brugere, så kan man ikke altid være _sikker_
på,
> > at det største id er det sidst indsatte. Andre kunne jo have enten
> > slettet eller tilføjet nye rækker i din tabel i mellemtiden - omend der
> > nok skal være mange brugere før det bliver et reelt problem.

Det er ikke det at der er mange brugere der giver problemer.

>
> Der er jo muligheden for at låse databasen imellemtiden....
>
> >Hvis man i
> > Access bruger tilfældige IDs, så kan man heller ikke bruge MAX(id)-
> > metoden.
>
> Nej, det kan du have fuldstændig ret i.....

Det er ikke tilfældige IDs jeg bruger, det er autonummerering og hvis man
tilføjer til databasen så får id et nummer der er 1 større end den seneste
der er blevet tilføjet.

Her er koden, hvor den altså skriver det id der er blevet tilføjet før den
jeg her tilføjer:

dbname = Server.Mappath("data.mdb")
strConn = "DBQ="& dbfolder & dbname & ";Driver={Microsoft Access Driver
(*.mdb)}; PWD="

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConn

Set objRS = Server.CreateObject("ADODB.RecordSet")
objRS.Open "SELECT * FROM data", strConn, 2, 3, &H0001

objRS.AddNew
objRS("vartime") = now
objRS("body") = "hej"
objRS.Update

objRS.Close
Set objRS = Nothing

SET messagenum = Conn.Execute("SELECT MAX(id) AS thismessagenum FROM data")
messagenum = messagenum("thismessagenum")

response.write messagenum

Conn.Close
Set Conn = Nothing

Mvh. Anders



Chrisser (04-11-2002)
Kommentar
Fra : Chrisser


Dato : 04-11-02 14:23

"Anders" <anders@no-mail.com> skrev i en meddelelse
news:aq5rfi$k9v$1@sunsite.dk...
>
> Her er koden, hvor den altså skriver det id der er blevet tilføjet før den
> jeg her tilføjer:
>
> dbname = Server.Mappath("data.mdb")
> strConn = "DBQ="& dbfolder & dbname & ";Driver={Microsoft Access Driver
> (*.mdb)}; PWD="
>
> Set Conn = Server.CreateObject("ADODB.Connection")
> Conn.Open strConn
>
> Set objRS = Server.CreateObject("ADODB.RecordSet")
> objRS.Open "SELECT * FROM data", strConn, 2, 3, &H0001
>
> objRS.AddNew
> objRS("vartime") = now
> objRS("body") = "hej"
> objRS.Update
>
> objRS.Close
> Set objRS = Nothing
>
> SET messagenum = Conn.Execute("SELECT MAX(id) AS thismessagenum FROM
data")
> messagenum = messagenum("thismessagenum")
>
> response.write messagenum

Jeg synes du har for mange "messagenum", du har både et rs det hedder sådan,
samt en alm. variabel der hedder det samme, det er forvirrende ( jeg ved
ikke ligefrem om det kan fucke koden up, men det er en god ide ex. at starte
alle recordset-variable med "rs",
eks: rsMessagenum. Så risikerer du heller ikke selv at blive forvirret...)


Men bortset fra det så var så det link som Jacob gav dig meget brugbart ud,
så prøv at kigge på det !

MVH
Chrisser



Jakob Andersen (04-11-2002)
Kommentar
Fra : Jakob Andersen


Dato : 04-11-02 14:26

"Anders" <anders@no-mail.com> wrote
> objRS.AddNew
> objRS("vartime") = now
> objRS("body") = "hej"
> objRS.Update

Lige når du har kaldt update kan du hente feltet ud sådan her:

messagenum = objRS("id")

Så er der slet ingen grund til at have nedenstående

> SET messagenum = Conn.Execute("SELECT MAX(id) AS thismessagenum FROM
data")
> messagenum = messagenum("thismessagenum")

--
Jakob Andersen



Anders (04-11-2002)
Kommentar
Fra : Anders


Dato : 04-11-02 14:36

"Jakob Andersen" <jakob@effectus.dk> skrev i en meddelelse
news:aq5sfa$1ju5$1@news.cybercity.dk...
> "Anders" <anders@no-mail.com> wrote
> > objRS.AddNew
> > objRS("vartime") = now
> > objRS("body") = "hej"
> > objRS.Update
>
> Lige når du har kaldt update kan du hente feltet ud sådan her:
>
> messagenum = objRS("id")

Du vil altså mene at følgende skulle virke, men det gør det ikke.
Den skriver statigvæk nummeret på den forrige der er blevet tilføjet.

Set objRS = Server.CreateObject("ADODB.RecordSet")
objRS.Open "SELECT * FROM data", strConn, 2, 3, &H0001

objRS.AddNew
objRS("vartime") = now
objRS("body") = "hej"
objRS.Update

messagenum = objRS("id")

objRS.Close
Set objRS = Nothing

response.write messagenum


> Så er der slet ingen grund til at have nedenstående
>
> > SET messagenum = Conn.Execute("SELECT MAX(id) AS thismessagenum FROM
> data")
> > messagenum = messagenum("thismessagenum")

Mvh. Anders



Jakob Andersen (04-11-2002)
Kommentar
Fra : Jakob Andersen


Dato : 04-11-02 14:53

"Anders" <anders@no-mail.com> wrote
> Du vil altså mene at følgende skulle virke, men det gør det ikke.
> Den skriver statigvæk nummeret på den forrige der er blevet tilføjet.
>
> Set objRS = Server.CreateObject("ADODB.RecordSet")
> objRS.Open "SELECT * FROM data", strConn, 2, 3, &H0001
>
> objRS.AddNew
> objRS("vartime") = now
> objRS("body") = "hej"
> objRS.Update
> messagenum = objRS("id")
> objRS.Close
> Set objRS = Nothing
>
> response.write messagenum

Prøv med:

Set objRS = Server.CreateObject( "ADODB.Recordset" )
objRS.Open "data", objConn, 1, 3, &H0002
objRS.AddNew
objRS( "vartime" ) = Now
objRS( "body" ) = "hej"
objRS.Update
messagenum = objRS( "id" )
objRS.Close
Set objRS = Nothing
Response.Write messagenum

Hvis det ikke bliver du nødt til at fortælle:

1. Hvad fejl du får
2. Hvordan din database ser ud

--
Jakob Andersen



Anders (04-11-2002)
Kommentar
Fra : Anders


Dato : 04-11-02 15:03

"Jakob Andersen" <jakob@effectus.dk> skrev i en meddelelse
news:aq5u0p$1l6h$1@news.cybercity.dk...
> > Du vil altså mene at følgende skulle virke, men det gør det ikke.
> > Den skriver statigvæk nummeret på den forrige der er blevet tilføjet.
> >
> > <kode>
>
> Prøv med:
>
> Set objRS = Server.CreateObject( "ADODB.Recordset" )
> objRS.Open "data", objConn, 1, 3, &H0002
> objRS.AddNew
> objRS( "vartime" ) = Now
> objRS( "body" ) = "hej"
> objRS.Update
> messagenum = objRS( "id" )
> objRS.Close
> Set objRS = Nothing
> Response.Write messagenum
>
> Hvis det ikke bliver du nødt til at fortælle:
>
> 1. Hvad fejl du får
> 2. Hvordan din database ser ud

ok, det ser ud til at virke perfekt. Hvad gør det af forskel om man bruger
1,3,&H0002 eller 2,3,&H0002 ?

Mvh. Anders



Jakob Andersen (04-11-2002)
Kommentar
Fra : Jakob Andersen


Dato : 04-11-02 15:15

"Anders" <anders@no-mail.com> wrote
> ok, det ser ud til at virke perfekt. Hvad gør det af forskel om man bruger
> 1,3,&H0002 eller 2,3,&H0002 ?

Det er forskellige cursortyper, locktyper og så til sidst en angivelse af at
vi blot angiver tabelnavn fremfor SQL. Se evt.:

<http://msdn.microsoft.com/library/en-us/ado270/htm/mdmthrstopen.asp>

Og det kan også stadig anbefales at læse den artikel jeg postede et link til
tidligere.

--
Jakob Andersen



Anders (04-11-2002)
Kommentar
Fra : Anders


Dato : 04-11-02 15:36

"Jakob Andersen" <jakob@effectus.dk> skrev
> > ok, det ser ud til at virke perfekt. Hvad gør det af forskel om man
bruger
> > 1,3,&H0002 eller 2,3,&H0002 ?
>
> Det er forskellige cursortyper, locktyper og så til sidst en angivelse af
at
> vi blot angiver tabelnavn fremfor SQL. Se evt.:
>
> <http://msdn.microsoft.com/library/en-us/ado270/htm/mdmthrstopen.asp>
>
> Og det kan også stadig anbefales at læse den artikel jeg postede et link
til
> tidligere.

Mange tak, man kan jo hele tiden blive klogere.

Mvh. Anders



Jakob Andersen (04-11-2002)
Kommentar
Fra : Jakob Andersen


Dato : 04-11-02 13:37

"Anders" <anders@no-mail.com> wrote
> Jeg skal bruge noget kode der kan fortælle det id nummer på rækken, som
lige
> er blevet tilføjet.

<http://www.adopenstatic.com/experiments/fastestautonumber.asp>

--
Jakob Andersen



Flemming Jensen (04-11-2002)
Kommentar
Fra : Flemming Jensen


Dato : 04-11-02 17:03

Jeg løb den anden dag ind i samme problem. Jeg løste problemet på en meget
dårlig måde. Efter jeg har tilføjet en post i databasen søger jeg efter alle
de data der blev indført som jeg har gemt i variabler og derved finder jeg
så det rigtige ID nummer, men det er jo en meget dårlig løsning, da to ens
poster giver det samme ID nummer, hvilket jo kun er rigtigt i det ene
tilfælde.



Carsten Suurland (06-11-2002)
Kommentar
Fra : Carsten Suurland


Dato : 06-11-02 22:53

Hej Anders

Brug "SELECT @@IDENTITY"

F.eks

Dim rsNewID 'Recordset
Set rsNewID = DB.Execute("INSERT INTO tblMyTable (Name, City) VALUES
('Anders', 'MinBy'); SELECT @@IDENTITY AS NewID;)

Response.Write rsNewID("NewID")

Når du gør det på denne måde (dvs. anvender en decideret INSERT kommando,
efterfulgt af @@IDENTITY) vil du altid få ID'et på den nyoprettede post.
Anvend aldrig SELECT Max() eller lignende.

/Carsten



Jakob Andersen (07-11-2002)
Kommentar
Fra : Jakob Andersen


Dato : 07-11-02 00:07

"Carsten Suurland" <removethiscarsten@suurland.dk> wrote
> Set rsNewID = DB.Execute("INSERT INTO tblMyTable (Name, City) VALUES
> ('Anders', 'MinBy'); SELECT @@IDENTITY AS NewID;)

Man kan mig bekendt IKKE sende flere SQL komandoer til access ad gangen.

> Når du gør det på denne måde (dvs. anvender en decideret INSERT kommando,
> efterfulgt af @@IDENTITY) vil du altid få ID'et på den nyoprettede post.
> Anvend aldrig SELECT Max() eller lignende.

Kan du forklare mig hvorfor @@Identity er bedre en SELECT MAX()? Jeg ville
netop mene det var omvendt da @@IDENTITY er global.

--
Jakob Andersen



Carsten Suurland (07-11-2002)
Kommentar
Fra : Carsten Suurland


Dato : 07-11-02 10:14

Hej Jakob

Du kan godt sende flere SQL sætninger til Access på samme tid...

Det er rigtigt at @@IDENTITY er global, men i og med at du fyrer det hele af
i en omgang, vil Access ikke tillade at der kommer andre INSERTS ind imellem
dine forespørgsler. Derfor vil du altid få det rigtige returneret

/Carsten




Jakob Andersen (07-11-2002)
Kommentar
Fra : Jakob Andersen


Dato : 07-11-02 11:05

"Carsten Suurland" <removethiscarsten@suurland.dk> wrote
> Du kan godt sende flere SQL sætninger til Access på samme tid...

Vil du evt. vise mig hvordan (jeg er ikke den store access haj).

> Det er rigtigt at @@IDENTITY er global, men i og med at du fyrer det hele
af
> i en omgang, vil Access ikke tillade at der kommer andre INSERTS ind
imellem
> dine forespørgsler. Derfor vil du altid få det rigtige returneret

Du kan vel også blot fyre din SELECT MAX() af i samme sætning.

--
Jakob Andersen



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

Månedens bedste
Årets bedste
Sidste års bedste