webForumDet fria alternativet

Simpel deletefråga

14 svar · 599 visningar · startad av comeback_coder

comeback_coderMedlem sedan okt. 201010 inlägg
#1

Har inte kodat på ett par år och har fastnat på ett otroligt simpelt problem.
Jag har en post i en databas jag vill radera.

 TEMP = Request.Querystring("id")
   TEMP1 = Session.SessionID 
   Set rsDsp = DataConn.Execute("DELETE FROM addtocart WHERE pro_id = " & TEMP AND ref= " & TEMP1)

Dvs, jag vill radera en post från databasen där pro_id är samma som id (detta får jag att fungera) men jag behöver ha med AND ref= och session id då + att jag endast vill att den skall ta en av posterna om det finns flera liknande.
Någon som orkar hjälpa en f.d dålig kodare som blivit ännu sämre med åren? :)

Tack på förhand!

voigtann1Medlem sedan juni 20019 519 inlägg
#2

Välkommen till wF!

Set rsDsp = DataConn.Execute("DELETE FROM addtocart WHERE pro_id = " & TEMP & " AND ref= " & TEMP1)

Du få bygga upp SQL strängen rätt, bör fungera bättre, även om du borde kolla in sql-injection.

comeback_coderMedlem sedan okt. 201010 inlägg
#3

Det fungerade bättre, men den raderar dock samtliga poster.
Det är som ni antagligen listat ut en kundvagn där kunden har sina produkter lagrade och har han lagt 5 stycken bollar i kundvagnen men bara vill ha 4 så vill jag kunna minska med endast en så att säga.

Tack för snabbt svar voigtann1! :)

voigtann1Medlem sedan juni 20019 519 inlägg
#4

Hur lagrar du antalet i varukorgen? Vilken databas kör du mot?
Hur ser resten av tabellen ut?

Ett förslag är att hämta top 1 och dess ID och ta bort den ifrån addToCart tabellen.

comeback_coderMedlem sedan okt. 201010 inlägg
#5

Har en accessdatabas med en tabell som heter addtocart.
Där i har jag 2 kolumner: pro_id och ref.
pro_id är ID på produkten, ref är det sessionsID som aktuell kund har.
Såhär ser det tex ut om man lagt 2 bollar i kundvagnen:

pro_id ref
1 234234324
1 234234324

Nu håller jag på med kassan och behöver en knapp som raderar en av dessa poster, nu tar den båda...

voigtann1Medlem sedan juni 20019 519 inlägg
#6

Ja, klart att den plockar båda, det är ju det SQL frågan säger ;)

Vad jag vet så kan du inte säga "delete top 1" du behöver en "Räknare" som gör varje rad unik för att hämta ut id:

("Delete from addToCart Where  Id = (Select Top 1 Id From addToCart Where WHERE pro_id = " & TEMP & " AND ref= " & TEMP1)
comeback_coderMedlem sedan okt. 201010 inlägg
#7

Men om jag skulle göra såhär:

Select top 1 * from addtocart where pro_id=test AND ref=sessionID

Finns det något kommando som sedan raderar alla poster (i det här fallet 1) som sql-satsen hämtat ut? Så kanske man kan göra?

@ndersMedlem sedan juni 200032 969 inlägg
#8

Du behöver någonting som gör posterna unika - ex. en räknare, sedan kan du göra som voigtann1 skriver.

Jag hade nog lagt till ett antalsfält också i tabellen, så är det bara att räkna upp/ner antalet, och göra delete istället för att sätta till 0.

Men en grundförutsättning är att du har en räknare på tabellen.

mvh

comeback_coderMedlem sedan okt. 201010 inlägg
#9

Nu har jag lagt in en räknade också (id) samt angett den som primärnyckel.
Prövade enligt voigtann1:s exempel:

    Set rsDsp = DataConn.Execute("Delete from addToCart Where  Id = (Select Top 1 Id From addToCart Where WHERE pro_id = " & TEMP & " AND ref= " & TEMP1)

Får dock detta felmeddelande:

•Error Type:
Microsoft JET Database Engine (0x80040E14)
Missing ), ], or Item in query expression 'Id = (Select Top 1 Id From addToCart Where WHERE pro_id = 25 AND ref= 146578120'.

Några tankar kring vad jag gjort fel?
(Antalsfältet låter också som en lösning men just nu är hela lösningen byggd på att räkna antal från kolumnen och jag har inte riktigt möjlighet att sätta mig ner och ändra allt det nu, stort tack för tipset dock @nders) :)

voigtann1Medlem sedan juni 20019 519 inlägg
#10

Du avslutar inte strängen:

Set rsDsp = DataConn.Execute("Delete from addToCart Where  Id = (Select Top 1 Id From addToCart Where WHERE pro_id = " & TEMP & " AND ref= " & TEMP1)")
comeback_coderMedlem sedan okt. 201010 inlägg
#11

Tack men nu får jag Unterminated string constant istället?

voigtann1Medlem sedan juni 20019 519 inlägg
#12

miss av mig:

Set rsDsp = DataConn.Execute("Delete from addToCart Where  Id = (Select Top 1 Id From addToCart Where WHERE pro_id = " & TEMP & " AND ref= " & TEMP1  & ")")
comeback_coderMedlem sedan okt. 201010 inlägg
#13

Nu fick jag syntax error in query expression istället... men känns som jag borde lära mig mer från grunden än att fråga om så "simpla" saker här hela tiden :)

Om man utgår från att jag har extremt simpla kunskaper, har ni något boktips på vad man skall skaffa sig för att lära sig? Är det ASP.NET Web Pages man skulle satsa på istället kanske?

@ndersMedlem sedan juni 200032 969 inlägg
#14

Du måste nog lägga till en ORDER BY på ditt räknarfält i subquery:n - annars kommer alla poster tas bort som matchar villkoren i subqueryn - trots att du har med TOP 1.

@ndersMedlem sedan juni 200032 969 inlägg
#15

Kan också vara så att Access vill ha "DELETE * FROM", inte bara "DELETE FROM".

mvh

132 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)