webForumDet fria alternativet

Fel vid användning av Recset

Databaser & SQLur Databashanterare & SQL

15 svar · 385 visningar · startad av Qimen

Medlem sedan juni 20015 009 inlägg
Frågan#1

Hej
Jag har ett script som läger till info till en databas. Detta fungerade bra med access men nu med MySql så får jag felmeddelandet:

En OLE DB-åtgärd i flera steg genererade fel. Kontrollera alla OLE DB-statusvärden som finns tillgängliga. Inget arbete utfördes.

/secure/add_member.asp, rad 50

Rad 50 är:

Addera = "Select * From members"
RecSet.Open Addera, Connect, adOpenStatic, adLockOptimistic

RecSet.AddNew

RecSet("fnamn") = Request.Form("fnamn")    [B]<-- Denna[/B]
RecSet("enamn") = Request.Form("enamn")
RecSet("stad") = Request.Form("stad")	
RecSet("epost") = Request.Form("email")	
RecSet("username") = Request.Form("username")
RecSet("losen") = Request.Form("pw1")
RecSet("datum") = Date
RecSet("when_user") = Date
RecSet("status") = "offline"

RecSet.Update
RecSet.Close

Vad är felet?

Medlem sedan feb. 20012 412 inlägg
#2

Det är ett väldigt ooptimalt sätt att göra en insert på, gör på följande sätt istället:

sql ="INSERT INTO members (fnamn, enamn, stad, epost, username, losen, [datum], when_user, status) " & _

" VALUES('" & Request.Form("fnamn") & "', '" & Request.Form("enamn") & "', '" & Request.Form("stad") & "', '" & Request.Form("epost") & "', " & _
" '" & Request.Form("username") & "', '" & Request.Form("losen") & "', Date(), Date(), offline)"

Connect.Execute sql,,128
Medlem sedan juni 20015 009 inlägg
#3

Hej Jörgen HP, tack för koden det funkade perfekt.. :birp

Medlem sedan feb. 20012 412 inlägg
#4

Vassegoo :bire

Medlem sedan juni 20015 009 inlägg
#5

Hej igen
Undrar bara kan man inte använda den koden på fler ställen?
Min sida för inloggning använde sig åsså av Recset men så vill mySql gå med på det heller så jag bytte till din. Men då får jag felmeddelandet:

Microsoft OLE DB Provider for ODBC Drivers fel '80004005'

[TCX][MyODBC]Duplicate entry '' for key 2

/secure/login_check.asp, rad 21

och rad 21 är just den raden:

Connect.Execute sql,,128

Ligger felet i koden eller kan det vara nått annat? Spelar det nånn roll om jag använder din kod två ggr i samma dokument?

Medlem sedan feb. 20012 412 inlägg
#6

Nej, det spelar ingen roll. Du har antaglien använt fnuttar lite konstigt. Du ska använda följande mönster:

'" & variabel_text_typ & "'

'" & variabel_datum_typ & "'

" & variabel_numerisk_typ & "
Medlem sedan juni 20015 009 inlägg
#7

humm jag undrar det också. Om jag bara har ett värde jag vill lägga till hur gör jag då? Ska man inte lägga till utan uppdatera när man redan har ett annat värde?

Jag fortfarande det felet. :(

Medlem sedan dec. 200012 464 inlägg
#8

Jo, det verkar som om du har definierat att det finns kolumner som är unika (username?) och då får du fel om du gör insert på samma värde. Det låter som om det är en update du skall göra.

Medlem sedan juni 20015 009 inlägg
#9

Alldeles rätt. I databsen så har "Username" unique men det är ju inte det fältet som ska uppdateras. Det är fältet status som är online då och ska uppdateras till offline.

Hur ska koden se ut om man vill updatera det? :q

Medlem sedan dec. 200012 464 inlägg
#10

En update kan se ut så här

update members set fname = 'Nils' , ename = 'Bilhorn'
where username = 'nisse'

Om du har fler kolumner som du vill uppdatera så är det bara att lägga till dom med ett komma emellan.

Medlem sedan juni 20015 009 inlägg
#11

Men det borde funka samma om det gäller många va?
För den ska ändra alla till offline som har varit inaktiva i 45 min.

Do Until RecSet.EOF

	If RecSet("status") = "online" AND DateDiff("n", RecSet("datum"), Now) > 45 Then
		
sql ="[B]här ska då update koden sitta[/B]"

Connect.Execute sql,,128
		
	End If
	
RecSet.MoveNext
Loop
	
RecSet.Close

Men hur ska den koden se ut?

Medlem sedan juni 20015 009 inlägg
#12

Kan den koden se ut så här?

[COLOR=#660000]sql ="update members set status = 'offline'"[/COLOR]
Medlem sedan juni 20015 009 inlägg
#13

Nopp det kunde man inte. Kan man göra typ så här:

[COLOR=#660000]sql ="update members set status = 'offline' where status = 'online' and DateDiff("n", RecSet("datum"), Now) > 45"[/COLOR]

Kan man inte göra nått liknande? :q

Medlem sedan mars 2002777 inlägg
#14

MySQL har egna funktioner för datumjämförelser:

WHERE Datum < SUBDATE(NOW(),INTERVAL 45 MINUTE)
Medlem sedan juni 20015 009 inlägg
#15

Alltså när jag nu försökte göra så att när man loggar in ska den kolla upp alla som har varit inaktiva i 45 minuter och sätta dem på offline om dem är på online. Men det vill inte funka. Jag provade så här:

 [COLOR=#660000]Do Until RecSet.EOF

sql ="update members set status = 'offline' where Datum < SUBDATE(NOW(),INTERVAL 45 MINUTE)"

Connect.Execute sql,,128
		RecSet.Update		
	End If
	
RecSet.MoveNext
Loop
	
RecSet.Close[/COLOR]

Jag får felmeddelande om att Programsats förväntas. Så pekar den på "End if"

Var är felet nu?

Medlem sedan juni 200032 967 inlägg
#16

Du ska inte köra detta i en loop.

Följande bör räcka:

 sql ="update members set status = 'offline' where Datum < SUBDATE(NOW(),INTERVAL 45 MINUTE)"

Connect.Execute sql,,128

Mvh,

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