webForumDet fria alternativet

set rs = databas.execute(sql) resp databas.execute(sql)

1 svar · 182 visningar · startad av leniz

lenizMedlem sedan aug. 2001676 inlägg
#1

Hej!

När jag kör en sql sats på följande sätt:
set rs = databas.execute(sql)
så stänger jag ju efter mig:
rs.close
set rs=nothing

Men om jag kör en sql sats på följande sätt:
databas.execute(sql)
då har jag ju inget att stänga (annat än databasen i slutet av filen).

Min fråga är hur en sida påverkas av många sql satser med t.ex. insert och update som körs med databas.execute(Sql)?

Är nämligen så att jag har en enkel statistik funktion som uppdaterar en sidas statistik varje gång den besöks. Det blir alltså en update eller en insert för varje besökare på varje sida. Det kanske inte låter som något problem men det finns över 800 sidor som har var sin statistik som ligger i samma access databas och det är många som tittar på dessa sidor (exakt hur många som tittar på sidorna exakt samtidigt vet jag inte). Är detta en rimlig förklaring till varför olika sidor ibland inte går att visa?

Mvh Lena

J.N.Medlem sedan apr. 20031 660 inlägg
#2

HEJ!

Detta är faktiskt enkelt, om man tänker efter. Vilket innebär att det tog några år även för mig att lista ut det.

När du kör INSERT, UPDATE, DELETE blir det inget rs, dvs då är set rs = databas.execute(sql) fel och databas.execute(sql) rätt.
Testa kör INSERT, och sedan stänga rs, då ska du få 'Operation is not allowed when the object is closed.'
Använd endast 'Databas.Close: Set Databas=nothing' alltså!

När ska man stänga rs då? När det finns. När finns det? Jo!
När du kör SELECT! Då är 'set rs = databas.execute(sql)' helt rätt, och rs och db-close helt rätt.

Eftersom jag inte vet om den koden du skriver är den du använder nämner bifogar jag lite finurliga funktioner:

Function open_db
	Dim databas, rs, dbconn, sql
	Set Databas = Server.Createobject("ADODB.Connection")
	Set RS = Server.CreateObject("ADODB.RecordSet")
	dbconn = "driver=SQL Server; server=localhost; Database=aknet;UID=akql;PWD=akPCrM" 'utv
	'dbconn = "driver=SQL Server; server=localhost; Database=wcom;UID=aksql;PWD=aWSl" 'live
	Databas.Open dbconn
End Function

Function close_rs_db()
	RS.close
	Set RS=nothing
	Databas.Close
	Set Databas=nothing
End Function

Function Close_rs(byRef RS)
	RS.Close
	Set RS = Nothing
End Function

Function Close_db()
	databas.Close
	Set databas = Nothing
End Function

Detta läggs i lämplig includefil som du säkert redan har db-kopplingen i.

Den första kallas via 'Call open_db' överst i sidan, den 2:a och 4:e via 'Call close_rs_db()' resp 'Call close_db()' om man har standard-rs resp endast en db-koppling.
Den 3:e slutligen använder man till 'Call close_rs(RS3)', dvs den tar det som står inom () och stänger det.

Ang sidräknaren hade jag nog lagt det i en txt-fil istället, dock har du ju en del sidor att hålla reda på = många filer...
I vilket fall tror jag inte det ska påverka databasen.

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