/ 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
At lukke Conn og RS ?
Fra : Jakob Munck


Dato : 23-06-03 08:11

Hvis man har åbnet en db-forbindelse er den en god idé at lukke den igen i
slutning af sin kode. Det kan man bl.a. læse i html's tuturial her:

www.html.dk/tutorials/asp/lektion19.asp

hvor man lukker forbindelsen sådan:

Conn.Close
Set Conn = Nothing

Jeg har 2 spørgsmål i den forbindelse:

1. Er det nødvendigt både at lukke forbindelsen (Conn.Close) og at sætte den
= Nothing, som gøres her?

2. I denne tuturial lukker man ikke også recordsettet (RS). Jeg ved ikke
hvorfor. Bør man ikke også skrive:

set RS = nothing

Eller er det unødvendigt, når man først har lukket forbindelsen (Conn)?

v.h.
Jakob Munck



 
 
Thomas Voller (23-06-2003)
Kommentar
Fra : Thomas Voller


Dato : 23-06-03 09:16

> 1. Er det nødvendigt både at lukke forbindelsen (Conn.Close) og at sætte
den
> = Nothing, som gøres her?

Ja. Det er to forskellige ting du udfører. I starten af din kode på siden
har du sikkert et par linier i denne stil:
Dim Conn
'Opret instans af connection-objektet
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.ConnectionString = [Din connect-string]
'Åbn forbindelsen til databasen
Conn.Open

Det der sker her, er at du første opretter en instans af Connection-objektet
og derefter åbner forbindelsen til databasen. Når du er færdig og vil lukke
ned, så skal du gøre tingene i omvendt rækkefølge:

'Luk forbindelsen
Conn.Close
'Fjern instansen af connection-objektet
Set Conn = Nothing


> 2. I denne tuturial lukker man ikke også recordsettet (RS). Jeg ved ikke
> hvorfor. Bør man ikke også skrive:
> set RS = nothing
> Eller er det unødvendigt, når man først har lukket forbindelsen (Conn)?

Jeg er ikke sikker, og fordi jeg ikke er sikker, så lukker jeg altid
recordsettet manuelt. Så bliver jeg i hvert fald sikker :)
'Luk recordsettet:
RS.Close
'Fjern instansen af recordset-objektet:
Set RS = Nothing

.... Herefter lukker jeg så forbindelsen til databasen og fjerner instansen
af connection objektet.




Mvh. Voller
voller@voller.nospam.dk
http://www.voller.dk

Bemærk nospam i e-mailadressen.



Jakob Munck (23-06-2003)
Kommentar
Fra : Jakob Munck


Dato : 23-06-03 10:19

> Jeg er ikke sikker, og fordi jeg ikke er sikker, så lukker jeg altid
> recordsettet manuelt. Så bliver jeg i hvert fald sikker :)
> 'Luk recordsettet:
> RS.Close
> 'Fjern instansen af recordset-objektet:
> Set RS = Nothing
>

Hvis jeg skriver sådan:

RS. Close
Set RS = Nothing

så får jeg en fejlmelding, hvor der står:

ADODB.Recordset (0x800A0E78)
Operation is not allowed when the object is closed.

Men hvis jeg fjerner den første linie (RS.Close), så virker det. Men jeg ved
ikke om recordsettet rent faktisk er lukket...?

v.h.
Jakob



Thomas Voller (23-06-2003)
Kommentar
Fra : Thomas Voller


Dato : 23-06-03 14:40

> Hvis jeg skriver sådan:
> RS. Close
> Set RS = Nothing
>
> så får jeg en fejlmelding, hvor der står:
> ADODB.Recordset (0x800A0E78)
> Operation is not allowed when the object is closed.

Har du lukket og fjernet Conn først? Den går ikke. Du skal lukke og fjerne
objekter i omvendt rækkefølge af hvad du åbner og opretter dem i. F.eks.:

Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.ConnectionString = [ din conn-string ]
objConn.Open

Dim objRS
Set objRS = objConn.Execute("Dit SQL-udtryk")

.... Gør noget ved dit recordset ...

objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing

Altså: Luk og fjern dine objekter i omvendt rækkefølge af hvad du åbner dem
i.




Mvh. Voller
voller@voller.nospam.dk
http://www.voller.dk

Bemærk nospam i e-mailadressen.



Jakob Munck (23-06-2003)
Kommentar
Fra : Jakob Munck


Dato : 23-06-03 15:29

Her kan du se et stykke kode, der giver fejlmelding, lige indtil man fjerner
RS.Close:

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

SQL = "SELECT * FROM tbKunstnere"
set RS = Conn.execute(SQL)

Conn.close
set Conn = nothing
RS.Close
set RS = nothing
%>

Derfor mener jeg ikke at man skal skrive RS.Close, med mindre der er noget
jeg helt har overset.....?

v.h.
Jakob



Thomas Voller (23-06-2003)
Kommentar
Fra : Thomas Voller


Dato : 23-06-03 15:43

> Set conn = Server.CreateObject("ADODB.Connection")
> Conn.Open "
> SQL = "SELECT * FROM tbKunstnere"
> set RS = Conn.execute(SQL)

Se engang på ovenstående. Der opretter og åbner du objekter i denne
rækkefølge:

1. En instans af connection-objektet. Set conn = ...
2. Du åbner din forbindelse. Conn.Open ...
3. Du opretter og åbner et recordset-objekt. Set RS = ...

Som jeg skrev i forrige indlæg, så skal du lukke og fjerne objekter i modsat
rækkefølge af hvad du oprettede dem. Dvs.: Først lukker og fjerner du din
instans recordset-objektet. Dem oprettede du nemlig til sidst. Derefter
lukker og fjerner du din instans af connection-objektet. På denne måde:

'Først fjerner vi recordset-objektet
RS.Close
Set RS = Nothing
'Det var din instans af recordset-objektet.

'Nu ryger din instans af connection-objektet
Conn.Close
Set Conn = Nothing
'Færdig. Alt er nulstillet.



Mvh. Voller
voller@voller.nospam.dk
http://www.voller.dk

Bemærk nospam i e-mailadressen.



Jesper Stocholm (23-06-2003)
Kommentar
Fra : Jesper Stocholm


Dato : 23-06-03 15:41

Jakob Munck wrote :

> Her kan du se et stykke kode, der giver fejlmelding, lige indtil man
> fjerner RS.Close:
>
> <%
> Set conn = Server.CreateObject("ADODB.Connection")
> Conn.Open "DRIVER={Microsoft Access Driver
> (*.mdb)};DBQ="&Server.MapPath("db.mdb")
>
> SQL = "SELECT * FROM tbKunstnere"
> set RS = Conn.execute(SQL)
>
> Conn.close
> set Conn = nothing
> RS.Close
> set RS = nothing

Som Thomas påpeger, så skal du lukke dem i den rækkefølge du bruger dem.
Hvis du lukker din Conn, så vil du automatisk lukke din rs i samme
ombæring. Derfor kan du principielt sige, at i netop dit tilfælde kan det
være ligemeget.

Prøv med

rs.close
set rs = nothing
conn.close
set conn = nothing

Dette vil være ækvivalent med

conn.close
set conn = nothing

Hvis du ønsker at sparke din performance helt i vejret, så lukker du din
rs i det øjeblik du er færdig med den, altså fx

set conn = server.createobject("ADODB.Connection")
set rs = conn.execute(sql)

do while not rs.EOF
   Response.write rs("somefield")
rs.movenext
loop
rs.close
set rs = nothing

'mere asp-kode til andre ting.

conn.close
set conn = nothing


--
Jesper Stocholm - http://stocholm.dk - http://asp-faq.dk
Skriv venligst under det du svarer på og skær det overflødige væk.
Se evt hvorfor på http://www.usenet.dk/netikette/citatteknik.html
Svar venligt til gruppen og ikke til mig privat !

Jesper Stocholm (23-06-2003)
Kommentar
Fra : Jesper Stocholm


Dato : 23-06-03 15:46

Jesper Stocholm wrote :


> Som Thomas påpeger, så skal du lukke dem i den rækkefølge du bruger
> dem.

Argh ... det skal selvfølgelig være i _modsat_ rækkefølge.

Sorry ...

--
Jesper Stocholm - http://stocholm.dk
** Vil det sige, at ham Lars er et stort brød på 15 år ? **
Svar venligst til gruppen og ikke til mig privat !
Skriv under det du svarer på - www.usenet.dk/netikette/citatteknik.html

Jørn Andersen (23-06-2003)
Kommentar
Fra : Jørn Andersen


Dato : 23-06-03 15:39

On Mon, 23 Jun 2003 16:28:49 +0200, "Jakob Munck"
<jakob.munck@tdcadsl.dk> wrote:

>Her kan du se et stykke kode, der giver fejlmelding, lige indtil man fjerner
>RS.Close:
<snip>
>Conn.close
>set Conn = nothing
>RS.Close
>set RS = nothing

Hvad så hvis du gør som Thomas foreslår:
RS.Close
Set RS = Nothing
Conn.close
Set Conn = Nothing
- ?

Humlen er, at Recordsettet er forbundet til databasen via Conn. Når du
så fjerner Conn har du ikke længere adgang til databasen, og du kan
derfor ikke manipulere med recordsettet - hvilket er nødvendigt for at
kunne RS.Close (men ikke for at slette objektet).

Good luck!

--
Jørn Andersen,
Brønshøj

Jakob Andersen (23-06-2003)
Kommentar
Fra : Jakob Andersen


Dato : 23-06-03 15:48

Jakob Munck skrev:
> Her kan du se et stykke kode, der giver fejlmelding, lige indtil man fjerner
> RS.Close:

[SNIP KODE]

> Derfor mener jeg ikke at man skal skrive RS.Close, med mindre der er noget
> jeg helt har overset.....?

Når du lukker forbindelsen (Conn) _skulle_ IIS gerne sørge for implicit
at lukke recordsets der bruger forbindelse. Så hvis man ikke helt stoler
på IIS i denne sammenhæng kan man manuelt lukke eventuelle recordsets
*før* man lukker sin forbindelse.

--
Jakob Andersen

Jakob Munck (23-06-2003)
Kommentar
Fra : Jakob Munck


Dato : 23-06-03 16:52

OK, nu tror jeg at jeg har forstået det. Når man skriver således:

RS.Close
Set RS = Nothing
Conn.close
Set Conn = Nothing

Kommer der ingen fejlmelding, så det må være ok.

Tak for hjælpen.

v.h.
Jakob Munck



Jakob Munck (23-06-2003)
Kommentar
Fra : Jakob Munck


Dato : 23-06-03 17:33

Men hvis man så er i tvivl om hvorvidt der overhovedet eksisterer et
Recordset, hvorfor kan man så ikke skrive:

if RS <> "" then
RS.Close
Set RS = Nothing
end if

Denne kode giver fejlmelding. Men hvordan skal det så skrives?

v.h.
Jakob



Jørn Andersen (23-06-2003)
Kommentar
Fra : Jørn Andersen


Dato : 23-06-03 17:56

On Mon, 23 Jun 2003 18:32:41 +0200, "Jakob Munck"
<jakob.munck@tdcadsl.dk> wrote:

>Men hvis man så er i tvivl om hvorvidt der overhovedet eksisterer et
>Recordset, hvorfor kan man så ikke skrive:
>
>if RS <> "" then
>RS.Close
>Set RS = Nothing
>end if

Det går ikke, fordi RS er et objekt og ikke en tekststreng. Prøv i
stedet med:
If IsObject(RS) Then
RS.Close
Set RS = Nothing
End if

- men følgende vil stadig give fejl:

Conn.Close
If IsObject(RS) Then
RS.Close
Set RS = Nothing
End if
- fordi objektet (RS) stadig eksisterer - der er bare ikke adgang til
at manipulere det.

Kig evt. på RecordSet'ets .State egenskab:
<url: http://www.w3schools.com/ado/prop_state.asp>
Mere generelt om RecordSet-objektet:
<url: http://www.w3schools.com/ado/ado_ref_recordset.asp>
Eller fra tutorial om ADO:
<url: http://www.w3schools.com/ado/ado_recordset.asp>

Good luck!

--
Jørn Andersen,
Brønshøj

Jakob Munck (23-06-2003)
Kommentar
Fra : Jakob Munck


Dato : 23-06-03 18:12

Tak Jørn, endnu en gang. Det virkede.

Jeg læser linkene og blir klogere.

v.h.
Jakob



Thomas Daugaard (25-06-2003)
Kommentar
Fra : Thomas Daugaard


Dato : 25-06-03 20:36


"Jørn Andersen" <jorn@jorna.dk> wrote in message
news:6kbefv0b7fgnrmrmrf084v6cpdldvs262e@4ax.com...
>
> Det går ikke, fordi RS er et objekt og ikke en tekststreng. Prøv i
> stedet med:
> If IsObject(RS) Then
[snip]

evt. If Not Rs Is Nothing Then ...

[snip]
>
> --
> Jørn Andersen,
> Brønshøj



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

Månedens bedste
Årets bedste
Sidste års bedste