|
| 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'> Nye kvinder: </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 " årig "
Response.Write rs.Fields("koen")
Response.Write " fra "
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: "
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'> Nye mænd </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
| |
|
|