/ 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
Lukke og slukke forbindelse til database.
Fra : Christian M. Nielsen


Dato : 26-11-03 18:29

Hej.

Lige et spørgsmål mere vedr. at lukke forbindelsen til databasen.

Jeg har nedenstående som en includefil på mine asp. sider, men jeg vil gerne
vide om det er den mest hensigtsmæssige måde, og om jeg får lukket alt der
er nødvendigt?

<%
Function openRecordset(strSQL)
Dim oRs, oConn
Set oConn = Server.CreateObject("ADODB.Connection")
Set oRs = Server.CreateObject("ADODB.Recordset")
oConn.Open Session("MINFORBINDELSE") '<---- har forbindelse til
global.asa, se nederst.
oRs.ActiveConnection = oConn
oRs.CursorType = adOpenKeyset
oRs.LockType = adLockOptimistic
oRs.Source = strSQL
oRs.Open
Set openRecordset = oRs
Set oRs = Nothing
Set oConn = nothing
End Function
%>

en strSQL kan se sådan ud

<%
strSQL = "SELECT * FROM tblMenuObjects WHERE Type >2 ORDER BY MenuType,
ArticleListOrder;"
set oRs = openRecordset(strSQL)
%>

Global.asa

<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnStart

Session.LCID = 1030
Session.CodePage = 1252

Session("MINFORBINDELSE") =
"DBQ="&Request.ServerVariables("APPL_PHYSICAL_PATH")&"log/XXXXX.mdb;" &_
"DefaultDir="&Request.ServerVariables("APPL_PHYSICAL_PATH")&"log/;" &_
"Driver={Microsoft Access Driver (*.mdb)};" &_
"DriverId=25;FIL=MS Access;" &_
"ImplicitCommitSync=Yes;" &_
"MaxBufferSize=512;" &_
"MaxScanRows=8;" &_
"PageTimeout=95;" &_
"SafeTransactions=0;" &_
"Threads=3;UID=admin;" &_
"UserCommitSync=Yes;"

END SUB
</SCRIPT>

--

Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
You can't keep time, but you can spend it right.




 
 
Jens Gyldenkærne Cla~ (27-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 27-11-03 11:41

Christian M. Nielsen skrev:

> Jeg har nedenstående som en includefil på mine asp. sider, men
> jeg vil gerne vide om det er den mest hensigtsmæssige måde, og
> om jeg får lukket alt der er nødvendigt?

Umiddelbart ser det fornuftigt ud - blot skal du huske at du også
skal lukke det postsæt som funktionen returnerer.

> <%
> strSQL = "SELECT * FROM tblMenuObjects WHERE Type >2 ORDER BY
> MenuType, ArticleListOrder;"
> set oRs = openRecordset(strSQL)
> %>

Det vil sige at når du er færdig med at bruge oRs, skal du have:

   oRs.Close
   Set oRs = Nothing
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Christian M. Nielsen (27-11-2003)
Kommentar
Fra : Christian M. Nielsen


Dato : 27-11-03 16:41

> Umiddelbart ser det fornuftigt ud - blot skal du huske at du også
> skal lukke det postsæt som funktionen returnerer.
>
> > <%
> > strSQL = "SELECT * FROM tblMenuObjects WHERE Type >2 ORDER BY
> > MenuType, ArticleListOrder;"
> > set oRs = openRecordset(strSQL)
> > %>
>
> Det vil sige at når du er færdig med at bruge oRs, skal du have:
>
> oRs.Close


Hvor vigtigt er det i forhold til oCon.close?

> Set oRs = Nothing

Den er med i min funktion

Desværre har jeg ikke kunne finde en løsning så .close er med i
includefilen, da jeg er slem til at gelmme at lukke med .close
--

Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
You can't keep time, but you can spend it right.



Jens Gyldenkærne Cla~ (27-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 27-11-03 21:42

Christian M. Nielsen skrev:

>> oRs.Close

> Hvor vigtigt er det i forhold til oCon.close?

Det ved jeg faktisk ikke. Som udgangspunkt mener jeg at man bør
lukke (.Close) og fjerne (Set xx = Nothing) såvel postsæt som
dataforbindelser.


>> Set oRs = Nothing
>
> Den er med i min funktion

Nej. Det er to forskellige variable (som her har fået samme navn).

I din funktion har du:

   Dim oRs ' <-- lokal variabel for funktionen

   Set oRs = Server.CreateObject("ADODB.Recordset")


....
   Set oRs = Nothing ' <-- Fjern lokal oRs

Men når du udenfor funktionen benytter en variabel kaldet oRs er
det en helt anden instans - og den hverken lukkes eller fjernes af
din funktion. Hvis den gjorde det, ville funktionen i øvrigt være
ubrugelig, fordi datasættet aldrig ville komme uden for funktionen.

Faktisk er det et problem ved din include-funktion - for du lukker
ikke den interne oRs. Dermed kan den - i hvert fald i princippet -
"hænge i luften" og optage resurser på serveren.

Jeg vil foreslå dig at flytte oRs og evt. også oConn ud som globale
variable og så lave to funktioner - én som initierer dem så de kan
benyttes af resten af koden og én som lukker og slukker efter brug.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Chrisser (28-11-2003)
Kommentar
Fra : Chrisser


Dato : 28-11-03 08:09

Jens Gyldenkærne Clausen wrote:
> Christian M. Nielsen skrev:
>
>>> oRs.Close
>
>> Hvor vigtigt er det i forhold til oCon.close?
>
> Det ved jeg faktisk ikke. Som udgangspunkt mener jeg at man bør
> lukke (.Close) og fjerne (Set xx = Nothing) såvel postsæt som
> dataforbindelser.

Et åbent recordset har sin egen dataforbindelse og den vil blive
vedligeholdt så længe det er åbent og connected. Man kan disconnecte
recordsets hvilket også anbefales kraftigt hvis man for eksempel har brug
for at gemme et sådant i en sessionsvariabel. Derfor er det lige så vigtigt
at lukke recordsets som selve databaseforbindelsen.

Info:
Et recordset disconnectes således:
rs.CursorLocation = adUseClient
oRecordSet.ActiveConnection = Nothing


Chrisser



Jens Gyldenkærne Cla~ (28-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-11-03 09:52

Chrisser skrev:

> Et recordset disconnectes således:
> rs.CursorLocation = adUseClient

(Hvor adUseClient så er en af de konstanter der er defineret i
adovbs.inc)

> oRecordSet.ActiveConnection = Nothing

Skal det ikke være:

   Set rs.ActiveConnection = Nothing
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Chrisser (28-11-2003)
Kommentar
Fra : Chrisser


Dato : 28-11-03 09:56

Jens Gyldenkærne Clausen wrote:
> Chrisser skrev:
>
>> Et recordset disconnectes således:
>> rs.CursorLocation = adUseClient
>
> (Hvor adUseClient så er en af de konstanter der er defineret i
> adovbs.inc)

Det er rigtigt

>> oRecordSet.ActiveConnection = Nothing
>
> Skal det ikke være:
>
> Set rs.ActiveConnection = Nothing

Det skal selvfølgelig være det recordsettet hedder - det gik vist lidt
hurtigt ( det der copy/paste )

Chrisser



Christian M. Nielsen (28-11-2003)
Kommentar
Fra : Christian M. Nielsen


Dato : 28-11-03 17:58

> >> Et recordset disconnectes således:
> >> rs.CursorLocation = adUseClient
> > Set rs.ActiveConnection = Nothing


Hvis jeg har en includefil med ovenstående NEDERST på mine sider, er der så
lukket og slukket for det hele, eller har jeg misforstået?

Hvis det ikke er rigtigt, kan man så med få linier, lukke og slukke for ALT
på een gang?

--

Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
You can't keep time, but you can spend it right.



Jens Gyldenkærne Cla~ (28-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 28-11-03 21:18

Christian M. Nielsen skrev:

>> >> Et recordset disconnectes således:
>> >> rs.CursorLocation = adUseClient
>> > Set rs.ActiveConnection = Nothing

> Hvis jeg har en includefil med ovenstående NEDERST på mine
> sider, er der så lukket og slukket for det hele, eller har jeg
> misforstået?

Ovenstående skal ikke stå i slutningen af en fil - det skal stå
umiddelbart efter åbningen af et postsæt hvis - og kun hvis - man
har brug for at have det afkoblet (disconnected). Normalt er det
ikke nødvendigt.

Normalt vil følgende linjer være nok:

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


- men det gælder kun for postsæt kaldet "rs" og dataforbindelser
kaldet "conn".

> Hvis det ikke er rigtigt, kan man så med få linier, lukke og
> slukke for ALT på een gang?

Nej. De fire linjer jeg har gengivet ovenfor er i mange tilfælde
nok, men det afhænger af hvad man kalder sine variable. Problemet
med at lukke dem via en includefil nederst er desuden at det mange
gange vil være senere end nødvendigt - dermed spilder man resurser.
Man bør lukke dataforbindelser når man er færdig med at bruge dem -
hverken før eller senere. Man kan evt. gemme de fire ovenstående
linjer i en sub (som så kan lægges i en includefil) - men selve
kaldet bør ligge umiddelbart efter den øvrige databasekode.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Christian M. Nielsen (29-11-2003)
Kommentar
Fra : Christian M. Nielsen


Dato : 29-11-03 08:34

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns9441D8C019468jcdmfdk@gyrosmod.cybercity.dk...
> Normalt vil følgende linjer være nok:
>
> rs.close
> set rs = nothing
> conn.close
> set conn = nothing

Jeg har det med at kalde mine oRs forskellige ting ned over en side, for at
kunne holde styr på dem, eksempel følger.

DIM strSQLMenuDyn, oRsMenuDyn, oRsMenuDynContent, strSQLMenuDynContent,
strType, strSQLMenuDynArticle, oRsMenuDynArticle

strSQLMenu = "SELECT * FROM tblArticle WHERE (ArticleMenuHeaderID = "&
strMenuID &") ORDER BY ArticleListOrder"
set oRsMenu = openRecordset(strSQLMenu)

strSQLMenuDynContent = "SELECT * FROM tblMenuObjects WHERE
(MenuType="&strMenuType&" AND Type > 3) ORDER BY ArticleListOrder"
set oRsMenuDynContent = openRecordset(strSQLMenuDynContent)


<snip en masse kode>

skal man så skrive specifikt

oRsMenuDynContent .close
set oRsMenuDynContent = nothing

for at lukke, eller er de 4 angivme sætninger nok?
--

Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
You can't keep time, but you can spend it right.



Jens Gyldenkærne Cla~ (29-11-2003)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 29-11-03 09:28

Christian M. Nielsen skrev:

> Jeg har det med at kalde mine oRs forskellige ting ned over en
> side, for at kunne holde styr på dem,

Det er som udgangspunkt også en god ide.


> skal man så skrive specifikt
>
> oRsMenuDynContent .close
> set oRsMenuDynContent = nothing

Ja. Du kan kun arbejde med variable ved at skrive deres eksakte
navne. ASP-fortolkeren kan ikke gætte sig til at "rs.Close" skal
fortolkes som "oRsMenu.Close + uRsData.Close + ..."
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html

Christian M. Nielsen (29-11-2003)
Kommentar
Fra : Christian M. Nielsen


Dato : 29-11-03 11:26

"Jens Gyldenkærne Clausen" <jens@gyros.invalid> wrote in message
news:Xns944260425148Djcdmfdk@gyrosmod.cybercity.dk...

> > skal man så skrive specifikt
> >
> > oRsMenuDynContent .close
> > set oRsMenuDynContent = nothing
>
> Ja. Du kan kun arbejde med variable ved at skrive deres eksakte
> navne. ASP-fortolkeren kan ikke gætte sig til at "rs.Close" skal
> fortolkes som "oRsMenu.Close + uRsData.Close + ..."

Jeg anede det nok, men ville lige være sikker.

Som jeg ser det, har jeg kun een oConn åben. Bliver den sat = Nothing
allerede i min includefil, eller skal jeg manuelt gøre det. Hvis manuelt, er
det så nok at gøre det sidst på siden?

Min includefil igen.

<%
Function openRecordset(strSQL)
Dim oRs, oConn
Set oConn = Server.CreateObject("ADODB.Connection")
Set oRs = Server.CreateObject("ADODB.Recordset")
oConn.Open Session("MINFORBINDELSE")
oRs.ActiveConnection = oConn
oRs.CursorType = adOpenKeyset
oRs.LockType = adLockOptimistic
oRs.Source = strSQL
oRs.Open
Set openRecordset = oRs
Set oRs = Nothing
Set oConn = nothing
End Function
%>


--

Mvh / Regards
-=< Christian >=-
What capital has 164 letters in its name? See my web page to find out.
http://www.cmnielsen.dk
You can't keep time, but you can spend it right.



Chrisser (01-12-2003)
Kommentar
Fra : Chrisser


Dato : 01-12-03 08:15

Christian M. Nielsen wrote:
> Min includefil igen.
>
> <%
> Function openRecordset(strSQL)
> Dim oRs, oConn
> Set oConn = Server.CreateObject("ADODB.Connection")
> Set oRs = Server.CreateObject("ADODB.Recordset")
> oConn.Open Session("MINFORBINDELSE")
> oRs.ActiveConnection = oConn
> oRs.CursorType = adOpenKeyset
> oRs.LockType = adLockOptimistic
> oRs.Source = strSQL
> oRs.Open
> Set openRecordset = oRs
> Set oRs = Nothing
> Set oConn = nothing
> End Function
> %>

Du lukker stadig ikke oConn - eller oRs.
Jeg vil foreslå dig det samme som Jens allerede har været inde på. Altså at
lægge åbning og lukning af databasen i hver sin Sub. Åbning og lukning af
recordsets kan så foregå i selve koden.
Hvis du vil have det i en funktion tror jeg du skal omformulere den, i
ovenstående bruger du ikke openRecordset til andet end at sætte dine andre
recordsets lig med den når din funktion returnerer - derefter "ligger den jo
bare og flyder" da du ikke lukker den efter dig...

Mvh
Chrisser



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste