|
| 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 |
| | |
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
| |
|
|