Avatar billede brownghost Nybegynder
20. juni 2006 - 22:14 Der er 18 kommentarer og
1 løsning

+ 1 til noget asp. hvordan

jeg finder her et ID og skal så ligge 1 til det id.
Eks finder den ID 11 skal lngTopicID være 12

    strSQL = "SELECT Max(Topic_ID) AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")

men kan ikke få det til at virke mente bare man satte + 1 bag efter men dette giver fejl.
er der en der lige kan vise mig hvordan.. tak
Avatar billede nielle Nybegynder
20. juni 2006 - 22:15 #1
strSQL = "SELECT Max(Topic_ID+1) AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")
Avatar billede brownghost Nybegynder
20. juni 2006 - 23:14 #2
ups var den forkerte sql hehe

det virker.. men har givet et nyt problem.

    strSQL = "SELECT Max(Thread_ID+1) AS ID FROM tblThread"
    lngThreadID = objConn.Execute(strSQL)("ID")

tabellen tblThread, Hvor Thread_ID er primary identety.
sletter jeg en post lad os sige post 12. og køre det oven over finden den 11 +1 = 12
men når der oprettes i det bliver det jo nummer 13. da det er identety.
Så når post 12 er brugt kan den aldrig komme tilbage.

Hvordan søre omgår jeg dette. så den her finde det næste id der faktisk vil blive skrevet.

    strSQL = "SELECT Max(Thread_ID+1) AS ID FROM tblThread"
    lngThreadID = objConn.Execute(strSQL)("ID")
Avatar billede nielle Nybegynder
21. juni 2006 - 06:27 #3
Jeg ved ikke hvordan du får den næste som vil blive trukket. Men hvotdor vil du egentlig have den? Måske er der en alternativ løsning til dit problem.
Avatar billede fennec Nybegynder
21. juni 2006 - 08:28 #4
Du kan ikke få det næste ID uden at lave en insættelse. Selv hvis du kunne, hvad så hvis 2 brugere kører scriptet samtidig??

Du bliver nød til at indsætte først, også trække ID'et ud med @@Identity. Så får du ALTID det rigtige ID.

objConn.execute("insert into tblTopic...")
set rs = objConn.execute("select @@identity")
ID = rs(0)
Avatar billede brownghost Nybegynder
21. juni 2006 - 10:27 #5
hummm kender jeg slet ikke det der.
kan du lave det i den her for mig?
Så vil jeg prøve det.

strSQL = "SELECT Max(Thread_ID+1) AS ID FROM tblThread"
lngThreadID = objConn.Execute(strSQL)("ID")
Avatar billede fennec Nybegynder
21. juni 2006 - 10:46 #6
Som sagt kan @@identity kun bruges EFTER en indsættelse, men du bruger sikkert det ID her længere nede i din kode. For at det virker skal du nok have flyttet om på din kode så den kører i den rigtige rækkefølge.

Hvis du nu viser os hele din kode, har vi nemmere ved at se hvad du vil, og hvordan det løses...
Avatar billede brownghost Nybegynder
21. juni 2006 - 19:38 #7
Hehe... Nice der gav du mig en super ide. at flytte rundt på tingene.
og oprette, indsætte, og her efter opdatere. så kan jeg nemlig få det til at virke..

Så ser koden sådan her ud.

    strSQL = _
        "INSERT INTO tblTopic(Forum_ID,Poll_ID,Moved_ID,Subject,Start_Date,Last_Entry_Date,No_Of_Views,Locked,Priority,NewsID) " & _
        "VALUES("& intForumID &",0,0,'" & strTitleName & "',GetDate(),GetDate(),0,0,0," & lngNewsID & ")"
    objConn.Execute strSQL
   
   
    strSQL = "SELECT Max(Topic_ID) AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")
   
    strSQL = _
        "INSERT INTO tblThread(Topic_ID,Author_ID,Message,Message_Date,Show_Signature,IP_Addr) " & _
        "VALUES(" & lngTopicID & "," & strTeamUserID & ",'" & strTeaser & "',GetDate(),0,'')"
    objConn.Execute strSQL
Else
    lngTopicID = rsTopic("Topic_ID")
End If

    strSQL = "SELECT Max(Thread_ID) AS ID FROM tblThread"
    lngThreadID = objConn.Execute(strSQL)("ID")


strSQL = "UPDATE tblTopic SET Start_Thread_ID=" & lngThreadID & ", Last_Thread_ID=" & lngThreadID & " WHERE Topic_ID=" & lngTopicID
        objConn.Execute strSQL

Response.Redirect "/forum/forum_posts.asp?TID=" & lngTopicID

I må gerne lave SVAR begge to. så acceptere jeg.
Mange tak

har lige at spørsmål mere.
Kan jeg låse de 2 tabeller mens min kode bliver kørt.  LOCK ?
så der ikke sker fejl hvis en bruger i forum poster en ny tråd på samme tid, så ider skifter mens min kode bliver afviklet.
Avatar billede nielle Nybegynder
21. juni 2006 - 19:48 #8
Din kode er imidlertid forkert ... ellere retter sagt den vil fejle før eller siden når to brugere benytter dit script på samme tid.

Når dette sker kan de få indst på samme tid, og så er "... Max(Topic_ID) ..." pludselig en usikker størrelse. I stedet for skal du som sagt bruge "@@IDENTITY", og dette betyder at sådan en som:

    strSQL = _
        "INSERT INTO tblTopic(Forum_ID,Poll_ID,Moved_ID,Subject,Start_Date,Last_Entry_Date,No_Of_Views,Locked,Priority,NewsID) " & _
        "VALUES("& intForumID &",0,0,'" & strTitleName & "',GetDate(),GetDate(),0,0,0," & lngNewsID & ")"
    objConn.Execute strSQL

    strSQL = "SELECT Max(Topic_ID) AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")

- skal rette til:

    strSQL = _
        "INSERT INTO tblTopic(Forum_ID,Poll_ID,Moved_ID,Subject,Start_Date,Last_Entry_Date,No_Of_Views,Locked,Priority,NewsID) " & _
        "VALUES("& intForumID &",0,0,'" & strTitleName & "',GetDate(),GetDate(),0,0,0," & lngNewsID & ")"
    objConn.Execute strSQL

    strSQL = "SELECT @@IDENTITY AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")

@@IDENTITY giver altid det index som der blev indsat under for den givne session.
Avatar billede brownghost Nybegynder
21. juni 2006 - 20:06 #9
Okay det prøver jeg lige :).

men hvad så med længere neede i koden, der hvor jeg skriver: ' HVAD SÅ MED HER ??


strSQL = _
        "INSERT INTO tblTopic(Forum_ID,Poll_ID,Moved_ID,Subject,Start_Date,Last_Entry_Date,No_Of_Views,Locked,Priority,NewsID) " & _
        "VALUES("& intForumID &",0,0,'" & strTitleName & "',GetDate(),GetDate(),0,0,0," & lngNewsID & ")"
    objConn.Execute strSQL
   
   
    strSQL = "SELECT @@IDENTITY AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")
   
    strSQL = _
        "INSERT INTO tblThread(Topic_ID,Author_ID,Message,Message_Date,Show_Signature,IP_Addr) " & _
        "VALUES(" & lngTopicID & "," & strTeamUserID & ",'" & strTeaser & "',GetDate(),0,'')"
    objConn.Execute strSQL

    ' HVAD SÅ MED HER ??
   
    strSQL = "SELECT Max(Thread_ID) AS ID FROM tblThread"
    lngThreadID = objConn.Execute(strSQL)("ID")


strSQL = "UPDATE tblTopic SET Start_Thread_ID=" & lngThreadID & ", Last_Thread_ID=" & lngThreadID & " WHERE Topic_ID=" & lngTopicID
        objConn.Execute strSQL

Skal den så ikke laves om også ?
Avatar billede nielle Nybegynder
21. juni 2006 - 20:11 #10
Samme opskrift:

strSQL = _
    "INSERT INTO tblThread(Topic_ID,Author_ID,Message,Message_Date,Show_Signature,IP_Addr) " & _
    "VALUES(" & lngTopicID & "," & strTeamUserID & ",'" & strTeaser & "',GetDate(),0,'')"
    objConn.Execute strSQL

    strSQL = "SELECT @@IDENTITY AS ID FROM tblThread"
    lngThreadID = objConn.Execute(strSQL)("ID")

Du skal være opmærksom på at @@IDENTITY skal bruges *umiddelbart* bagefter den INSERT-sætning som den hører til.
Avatar billede brownghost Nybegynder
21. juni 2006 - 20:12 #11
Humm give fejl at sætte det @@IDENTITY ind.

Description    [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near ','.
Location    /news/newsforum.asp line 50

----------
har testet det der.
<%
strSQL = "SELECT @@IDENTITY AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")
%>

testerid: <%= lngTopicID %>

der kommer intet ID ud af det.
jeg bruger win2003, MS SQL 2000..

er det noget Access kode du har givet mig ? hehe
Avatar billede nielle Nybegynder
21. juni 2006 - 20:47 #12
Hvad står der i linje 50 og nabolinjerne?

@@IDENTITY du i både Access og MS SQL server. I MS SQL server anbefales det do at mab bruger funktionen SCOPE_IDENTITY i stedet:

strSQL = "SELECT SCOPE_IDENTITY() AS ID FROM tblTopic"
lngTopicID = objConn.Execute(strSQL)("ID")


Læs mere her:

http://www.sqlteam.com/item.asp?ItemID=319
Avatar billede brownghost Nybegynder
21. juni 2006 - 22:07 #13
fik at vide fra ham der har lavet forum, at det kun er 1 ud af 1.000.000 gange det sker med den max funktion. og så sage han at det ikke var et problem. forum retter det ved næste post hehe.. Så alt okay nu spiller det max..

Tak til all. SVAR, så godkender jeg jer alle :)
Avatar billede nielle Nybegynder
21. juni 2006 - 22:21 #14
"1 ud af 1.000.000 gange" er et meget løst udsagn som ikke har nogen vidre værdi. Hvor tit det sker afhænger ultimativt af hvor mange besøg et site har ... af belastningen.

Men hvorfor iøvrigt stille sig til tåls med at det fejler "1 ud af 1.000.000 gange" når man så let som ingen ting kan lave noget som aldrig fejler?!
Avatar billede brownghost Nybegynder
22. juni 2006 - 02:21 #15
men det her: @@IDENTITY virker bare ikke

det her virker heller ikke, skriver ingen ID..
Så fejler siden

<%
strSQL = "SELECT SCOPE_IDENTITY() AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")
%>

testerid: <%= lngTopicID %>
Avatar billede nielle Nybegynder
22. juni 2006 - 06:13 #16
Så er det vel bare fordi at der er en lille fejl et eler andet sted.

Hvad siger fejlen? Og i hvilke linje fejler den?
Avatar billede fennec Nybegynder
22. juni 2006 - 08:24 #17
Jeg har oplevet at MS-SQL ikke rigtig vil acceptere IDENTITY når det står i flere linjer. Det virker tilgængæld hvis du henter det ud sammen med insættelsen. Så skal du også kun køre EN sql:

sql = "SET NOCOUNT ON; Insert into Dintabel(..) values(..);SELECT @@IDENTITY AS ID;"
set rs = objConn.execute(sql)
lngTopicID = rs("ID")

Jeg oplevede dette for første gang for en måned siden, og har ikke haft tid til at undersøge hvorfor det sker. Om ikke andet så virker det når det står i samme linje.
Avatar billede brownghost Nybegynder
22. juni 2006 - 11:55 #18
hummmmm
Avatar billede brownghost Nybegynder
22. juni 2006 - 11:56 #19
PS, der var ingen fejl. den test jeg kørte kørte jeg bare i en test file jeg havde lavet.

<%
strSQL = "SELECT SCOPE_IDENTITY() AS ID FROM tblTopic"
    lngTopicID = objConn.Execute(strSQL)("ID")
%>

testerid: <%= lngTopicID %>

så jeg kunne se ID'et men den skrev jo ikke noget.

Alt okay nu, tak for din hjælp :)
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