/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
Kode der lukker alle recordsets?
Fra : Jakob Munck


Dato : 04-01-02 20:30

Jeg har i en af mine sites en stor asp-fil med ca. 6000 linier i, opbygget
som en casestruktur. Mange steder anvendes recordset-metoden/erne til at
gøre det ene og andet, og derfor skal alle disse recordsets naturligvis
lukkes, når koden er kørt. Men de mange recordsets - som ikke køres på en
gang - har forskellige navne. De hedder bl.a:

Con
Conn
conn2
oRs
rs
fso
msg

Spørgsmålet er så om jeg kan lukke ALLE recordsets, uanset navn, med en
bestemt kode, eller om man skal skrive

xxx.close
set xxx = nothing

for hver enkelt mulig variant af navn til et recordset. Findes en "luk alle
recodset" kode?

v.h.
Jakob Munck

etc.



 
 
Jakob Andersen (05-01-2002)
Kommentar
Fra : Jakob Andersen


Dato : 05-01-02 01:03

"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c360101$0$89071$edfadb0f@dspool01.news.tele.dk...
> Jeg har i en af mine sites en stor asp-fil med ca. 6000 linier i, opbygget
> som en casestruktur. Mange steder anvendes recordset-metoden/erne til at
> gøre det ene og andet, og derfor skal alle disse recordsets naturligvis
> lukkes, når koden er kørt. Men de mange recordsets - som ikke køres på en
> gang - har forskellige navne. De hedder bl.a:

Der er noget fundementalt forkert hvis du bruger så mange recordsets.

Overvej evt. at lave koden mere funktionsbaseret og gør brug af lokale
variabler.
--
Jakob Andersen



Jakob Munck (05-01-2002)
Kommentar
Fra : Jakob Munck


Dato : 05-01-02 08:12

>
> Der er noget fundementalt forkert hvis du bruger så mange recordsets.
>
> Overvej evt. at lave koden mere funktionsbaseret og gør brug af lokale
> variabler.
> --

De mange recordset bruges jo ikke på én gang, men afhængig af hvilken
funktion brugerne vælger (send brev, læs brev, skriv i gæstebog, opret
favorit etc.). Jeg kunne selvfølgelig vælge, at kalde dem alle det samme, og
dermed lukke dem med den samme kommando, sat efter slutningen af
case-strukturen, men hvis der eksisterer en kommendo der lukker alle
recordset, uanset navn, så er det lettest at bruge den.

Jeg er ikke klar over hvad du mener med at gøre koden mere
"funktionsbaseret" og at bruge "lokale variable" ? Hvis du kan uddybe det en
smule, vil jeg være glad.

v.h.
Jakob Munck



Jakob Andersen (05-01-2002)
Kommentar
Fra : Jakob Andersen


Dato : 05-01-02 13:52

"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c36a56b$0$62879$edfadb0f@dspool01.news.tele.dk...
> De mange recordset bruges jo ikke på én gang, men afhængig af hvilken
> funktion brugerne vælger (send brev, læs brev, skriv i gæstebog, opret
> favorit etc.).

Okay.

> Jeg kunne selvfølgelig vælge, at kalde dem alle det samme, og
> dermed lukke dem med den samme kommando, sat efter slutningen af
> case-strukturen, men hvis der eksisterer en kommendo der lukker alle
> recordset, uanset navn, så er det lettest at bruge den.

Der findes så vidt jeg ved ikke en komando der lukker alle recordsets. Så
jeg vil anbefale dig at kalde dem alle sammen det samme.

> Jeg er ikke klar over hvad du mener med at gøre koden mere
> "funktionsbaseret" og at bruge "lokale variable" ? Hvis du kan uddybe det
en
> smule, vil jeg være glad.

F.eks. laver du en funktion til at læse et brev sådan her:

function LaesBrev( Brevid )
Dim objConn
Set objConn = Server.CreateObjcet( "ADODB.Connection")
objConn.Connectionstring = "DIN CONNECTIONSTRING HER"
Dim objRS
Set objRS = objConn.Execute( "SELECT felt1, felt2 FROM tabel WHERE id =
" & Brevid)

'Udskriv poster

Set objRS = Nothing
objConn.Close
Set objConn = Nothing
End function

Så holder du connection og recordset objekterne inde i funktionen, det vil
sige at de kun er tilgængelige der og hurtigere bliver allokeret i
hukkomelsen.

--
Jakob Andersen



Jakob Munck (05-01-2002)
Kommentar
Fra : Jakob Munck


Dato : 05-01-02 16:49

OK, jeg er med. Tak for råd.

Det vil jeg forsøge at rette mig efter.

jm



Jakob Munck (05-01-2002)
Kommentar
Fra : Jakob Munck


Dato : 05-01-02 22:54

Men hvordan kan det være, at hvis jeg laver et kald af denne type, og
slutter med at lukke recordsettet, så virker det overhovedet ikke?

Se kode:

<%
set rs1 = Conn.Execute("select count(*) as antalmedlemmer from bruger")
antal_medlemmer = rs1("antalmedlemmer")

......div. kode.....

rs1.close
%>

Denne kode virker ikke før man har udkommenteret rs1.close ! Hvorfor det?
Jeg troede netop, at man skulle huske at "rydde op efter sig", men det kan
man jo ikke, når koden så ikke virker !

Hvad er forklaringen?

v.h.
Jakob Munck






Lars Jensen (06-01-2002)
Kommentar
Fra : Lars Jensen


Dato : 06-01-02 00:35

"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c377422$0$89114$edfadb0f@dspool01.news.tele.dk...
> Men hvordan kan det være, at hvis jeg laver et kald af denne type, og
> slutter med at lukke recordsettet, så virker det overhovedet ikke?

> Se kode:

> rs1.close

> Denne kode virker ikke før man har udkommenteret rs1.close ! Hvorfor det?
> Jeg troede netop, at man skulle huske at "rydde op efter sig", men det kan
> man jo ikke, når koden så ikke virker !
> Hvad er forklaringen?
> Jakob Munck

Er det ikke Conn.Close??

--

Mvh.

Lars [ZulFo] Jensen




Torben Brandt (06-01-2002)
Kommentar
Fra : Torben Brandt


Dato : 06-01-02 01:05

Lars Jensen wrote in dk.edb.internet.webdesign.serverside.asp:
> "Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
> news:3c377422$0$89114$edfadb0f@dspool01.news.tele.dk...
> >
> > rs1.close
>
> Er det ikke Conn.Close??
>

Jeg tror der er sket en mindre forvirring her.
Jakob Munck skriver i det første indlæg om objekterne:
Con, Conn, conn2, oRs, rs, fso, msg
Dem omtaler han alle som recordsets.

Men det er nok her noget går galt, for jeg tror kun at det er oRs og rs, der
er recordsets, mens dem med con er databaseforbindelser og fso er et
Filesystemobject. osv.

Det er kun databaseforbindelserne der skal lukkes med .close (det er kun dem
der tidligere er kaldt .open(..) til).
Alle skal dog sættes til Nothing bagefter.

Ellers synes jeg dog at Jakob Andersens forslag med Functions hjælper _meget_
på overskueligheden, så man får lukket det hele. Dog vil jeg gerne lige
spørge:
Vil det ikke tage lang tid, hvis man skal åbne og lukke databasen flere gange,
eller betyder det ikke så meget?

mvh. Torben


--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Jakob Andersen (06-01-2002)
Kommentar
Fra : Jakob Andersen


Dato : 06-01-02 01:40

"Torben Brandt" <torben@actuar.dk> wrote in message
news:a184ap$a4s$1@sunsite.dk...
> Vil det ikke tage lang tid, hvis man skal åbne og lukke databasen flere
gange,
> eller betyder det ikke så meget?

Du har mere hukkomlse at danse med når du lukker objekterne så hurtigt som
muligt og det er vel det væsentligste for at undgå at presset tvinger
serveren i knæ. Derudover er det minimalt hvilken processorkraft der
benyttes for at åbne databasen.

--
Jakob Andersne



Jakob Munck (06-01-2002)
Kommentar
Fra : Jakob Munck


Dato : 06-01-02 08:10

Torben Brandt du har ret. Jeg blander vist tingene sammen, og det skal jeg
holde op med. Jeg vil straks gennemgå koden for at finde ud af hvad der er
hvad og lukke tingene på rette vis.

Tak for det.

jm



Jakob Munck (06-01-2002)
Kommentar
Fra : Jakob Munck


Dato : 06-01-02 16:00

Jeg forstår stadig ikke ! Det siges at man altid skal lukke recordset efter
at de har været anvendt. Men i den følgende kode, der virker fint og viser 2
x 5 records fra en tabel, er det ikke sådan. Hvis jeg ikke udkommenterer
rs.close (3. nederste linie markeret med =>) virker databasekaldet
overhovedet ikke og siger, at "Handlingen er ikke tilladt, mens objektet er
lukket."

Det tyder da på, at man netop IKKE må lukke alle recordset når koden er
eksekveret. Eller er der noget jeg har misforstået?

Se koden her:

<%
Set conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver
(*.mdb)};DBQ="&Server.MapPath("dbget2you.mdb")
%>

<html><head></head><body>

<%
set rs1 = Conn.Execute("select count(*) as antalmedlemmer from bruger")
antal_medlemmer = rs1("antalmedlemmer")
%>

<table border="0" width="78%" align="center" bordercolor="0000ff"
cellpadding="4">
<tr><td width="50%" valign="top">

<%
sSql = "SELECT TOP 5 * FROM bruger WHERE koen = 'kvinde' and hvadsoegerdu <>
'Sexpartner' ORDER BY brugerId DESC;"

set rs = GetRecordSet()

response.write "<table bordercolor='ff0000' border='0' width='100%'
align='center' cellpadding='0' cellspacing='0'><tr bgcolor='606060'
align='center'><td class='hvid11'>&nbsp;Nye kvinder:&nbsp;</td></tr>"
VisIndhold()
response.write "</table>"

%>

</td>
<td width="50%" valign="top">

<%

sSql = "SELECT TOP 5 * FROM bruger WHERE koen = 'mand' and hvadsoegerdu <>
'Sexpartner' ORDER BY brugerId DESC;"

Function GetRecordSet()
set oRs = Server.CreateObject("ADODB.Recordset")
oRs.Open sSql, Conn,1,1,1
set GetRecordSet = oRs
End function

Sub VisIndhold()
RowCount = 1
Do While Not rs.EOF and rowcount > 0
Response.Write "<tr><td align=center class=sort11>"
Response.Write "<a href='get2you.asp?mode=login_form' target='_self'>" &
rs.Fields("brugerNavn") & "</a>"
Response.Write "</td></tr><tr><td align=center class=sort11><b>"
Response.Write rs.Fields("alder")
Response.Write "&nbsp;årig&nbsp;"
Response.Write rs.Fields("koen")
Response.Write "&nbsp;fra&nbsp;"
Response.Write rs.Fields("bopael")
Response.Write "</b></td></tr><tr><td align=left class=sort11 height=54>"
Response.Write Left(rs.Fields("beskrivdigselv"),100)
Response.Write "......<br></td></tr><tr><td
class=graa11><center>Indmeldt:&nbsp;"
Response.Write Left(rs.Fields("indmTid"),10)
Response.Write "</center><br></td></tr>"
rs.MoveNext
loop
End Sub

set rs = GetRecordSet()

response.write "<table bordercolor='ff0000' border='0' width='100%'
align='center' cellpadding='0' cellspacing='0'><tr bgcolor='606060'
align='center'><td class='hvid11'>&nbsp;Nye mænd&nbsp;</td></tr>"
VisIndhold()
response.write "</table>"
%>

</td>
</tr></table>
<br></td></tr></table>
</body></html>

<%
conn.close

=> '''rs.close

set conn = nothing
set rs1 = nothing
%>

v.h.
Jakob Munck



Torben Brandt (06-01-2002)
Kommentar
Fra : Torben Brandt


Dato : 06-01-02 17:08

Jakob Munck wrote in dk.edb.internet.webdesign.serverside.asp:
> Jeg forstår stadig ikke ! Det siges at man altid skal lukke recordset efter
> at de har været anvendt. Men i den følgende kode, der virker fint og viser 2
> x 5 records fra en tabel, er det ikke sådan. Hvis jeg ikke udkommenterer
> rs.close (3. nederste linie markeret med =>) virker databasekaldet
> overhovedet ikke og siger, at "Handlingen er ikke tilladt, mens objektet er
> lukket."
>
> Det tyder da på, at man netop IKKE må lukke alle recordset når koden er
> eksekveret. Eller er der noget jeg har misforstået?
>
> Se koden her:

<klip>

> <%
> conn.close
>
> => '''rs.close
>
> set conn = nothing
> set rs1 = nothing
> %>

Jeg har godt nok aldrig hørt at man skal lukke RecordSets - kun
databaseforbindelser, men derfor kan det sagtens være at man burde. Jeg har
ikke læst så meget om det.

Jeg har dog gjort den erfaring af hvis man trækker data ud fra databasen i et
recordset og lukker databaseforbindelsen, så kan man ikke tage data fra
recordsettet.
Så det er ligesom om at kaldet conn.close også lukker recordsettet på en eller
anden måde.

Så hvis man vil kalde rs.close, så skal det nok være før man kalder
conn.close.

Personligt vidste jeg ikke engang at man kunne lukke recordsets, før nu, og
jeg har ikke haft problemer. Så umiddelbart vil jeg råde dig til bare at bruge
koden, som den er (uden rs.close), det virker jo.

mvh. Torben

--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

MacMan (06-01-2002)
Kommentar
Fra : MacMan


Dato : 06-01-02 17:47

I brevet "a19sp1$aco$1@sunsite.dk" skrev Torben Brandt (torben@actuar.dk)
den 06/01/02 17:08:

> Jakob Munck wrote in dk.edb.internet.webdesign.serverside.asp:
>> Jeg forstår stadig ikke ! Det siges at man altid skal lukke recordset efter
>> at de har været anvendt. Men i den følgende kode, der virker fint og viser 2
>> x 5 records fra en tabel, er det ikke sådan. Hvis jeg ikke udkommenterer
>> rs.close (3. nederste linie markeret med =>) virker databasekaldet
>> overhovedet ikke og siger, at "Handlingen er ikke tilladt, mens objektet er
>> lukket."
>>
>> Det tyder da på, at man netop IKKE må lukke alle recordset når koden er
>> eksekveret. Eller er der noget jeg har misforstået?
>>
>> Se koden her:
>
> <klip>
>
>> <%
>> conn.close
>>
>> => '''rs.close
>>
>> set conn = nothing
>> set rs1 = nothing
>> %>
>
> Jeg har godt nok aldrig hørt at man skal lukke RecordSets - kun
> databaseforbindelser, men derfor kan det sagtens være at man burde. Jeg har
> ikke læst så meget om det.

Det skal man.
IIS gør det i en vis grad, men er bestemt ikke god til det, så før eller
siden dræber det serveren.

Sådan gøres det korrekt:


RS1.Close
Set RS1 = Nothing

Conn.Close
Set Conn = Nothing


- Morten


Jakob Munck (06-01-2002)
Kommentar
Fra : Jakob Munck


Dato : 06-01-02 19:59

> Sådan gøres det korrekt:
>
>
> RS1.Close
> Set RS1 = Nothing
>
> Conn.Close
> Set Conn = Nothing
>

Hvordan kan det så være, at når jeg lukker det 3. recordset i denne kode
("oRs") ved at skrive:

oRs.close
Set oRs = Nothing

så får jeg en fejlmelding der siger at siden ikke kan vises fordi "Et objekt
er obligatorisk" ?

Hvorfor skal man lukke recordsettene RS1 og Conn, men ikke oRS ?

v.h.
Jakob Munck



Peter Lykkegaard (06-01-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 06-01-02 19:45


"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c3864ac$0$62890$edfadb0f@dspool01.news.tele.dk...
>
> Det tyder da på, at man netop IKKE må lukke alle recordset når koden er
> eksekveret. Eller er der noget jeg har misforstået?
>
> conn.close
> => '''rs.close
>
Du skal lukke dit recordset før din connection

Og JA du _skal_ lukke dit recordset - af samme grund (ca som du lukker
din dør efter dig når du går ind i huset

mvh/Peter Lykkegaard
mvh/Peter Lykkegaard




Jakob Munck (06-01-2002)
Kommentar
Fra : Jakob Munck


Dato : 06-01-02 20:30

Efter at have testet dette på forskellig vis på min egen kode må jeg
konstatere, at det - langt de fleste steder - giver fejlmelding af lukke et
recordset og derefter forbindelsen (Conn) efter at koden skulle være
afsluttet. Men kan lukke forbindelsen, men ikke lukke recordsettet, uanset
hvilken rækkefølge det gøres i.

Det virker bare ikke. Men hvorfor det ikke virker, det ved jeg ikke !

jm



Peter Lykkegaard (06-01-2002)
Kommentar
Fra : Peter Lykkegaard


Dato : 06-01-02 23:48


"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c38a3e9$0$37906$edfadb0f@dspool01.news.tele.dk...
> Efter at have testet dette på forskellig vis på min egen kode må jeg
> konstatere, at det - langt de fleste steder - giver fejlmelding af lukke
et
> recordset og derefter forbindelsen (Conn) efter at koden skulle være
> afsluttet. Men kan lukke forbindelsen, men ikke lukke recordsettet, uanset
> hvilken rækkefølge det gøres i.
>
> Det virker bare ikke. Men hvorfor det ikke virker, det ved jeg ikke !
>
Du gør et eller andet galt
Bruger option explicit øverst på din side?
Det gør at du _skal_ erklære alle dine variabler
Gør det øverst på siden for de globale variabler

Brug en entydig navngivning for dine variabler fx rsMineData for dine
recordsets og conMinDB for din connection
Af andre kan nævnes fso for FileSystemObject

Vær sikker på at dine recordsets _ikke_ bliver lukket (vha close) inde i en
sub rutine
Ellers brug variablen i subrutinen og kun der

Vær opmærksom på at paramater kald uden explicit ByVal bliver opfattet som
ByRef af VBScript
Dvs hvad du gør med din globale variabel i din subrutine det har effekt for
hele siden

Du kan evt bruge grs, gcon, gfso for dine globale variabler

Bruger du include filer efter at du har åbnet recordsettet?
Bruger du samme variabler i din include fil? og kan det være her du lukker
dit recordset?

Summa summarum - gå din kode igennem med en tættekam
Du _skal_ kunne lukke et recordset vha metoden close - hvis recordsettet vel
at mærke er åbent
Hvis dit/dine recordsets er lukket uden at du forventer det, så er der noget
strukturelt galt med din kode

mvh/Peter Lykkegaard



Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408945
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste