Avatar billede pollas Nybegynder
23. april 2002 - 11:24 Der er 15 kommentarer og
2 løsninger

Connection sub

Tænkte jeg ville hive min connection ud i en sub, der så ligger i en include-fil på de sider, hvor jeg skal connecte.

Altså noget i stil med:

sub open()
conn bla bla
end sub

Som så på selve siden skulle bruges som:

open()
set rs = conn.execute(sql)
rs bla bla
rs.close

osv...

Men på denne måde får jeg at vide, at conn ikke er oprettet - object required 'conn'. Selve conn-delen i sub'en er ok - kører jeg den uden for sub'en virker det fint.

Har jeg sovet et eller andet sted?
Avatar billede netsrac Praktikant
23. april 2002 - 11:29 #1
Hvorfor lavet det i en sub ? Hvis det bare er for at have en include fil, kan du ligeså godt lave to filer dbopen.asp og db.close også have:

<%
Set Conn = ..
Conn.Open ..
%>

og i dbclose.asp
<%
Conn.close
Set Conn = nothing
%>

Så kan du bare inklude filerne i toppen og bunden af de sider hvor du skal bruge databasen.
Avatar billede askhoej Praktikant
23. april 2002 - 11:31 #2
Her er et eksempel på en funktion der returnere et RecordSet

Function MakeRecordset(strSQL)

Dim strConnect
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=c:\test.mdb;" & _
            "Persist Security Info=False"

Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open StrConnect

Dim RS
Set RS = objConn.Execute(strSQL)
       
Set MakeRecordset = RS

Set RS = Nothing
End Function

Og en sub der eksekvere en SQL streng

Sub ExecuteSQL(strSQL)

Dim strConnect
strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=c:\test.mdb;" & _
            "Persist Security Info=False"

Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Mode = 3

objConn.Open StrConnect

objConn.Execute(strSQL)         
End Sub
Avatar billede pollas Nybegynder
23. april 2002 - 11:31 #3
Tja, det kan du selvfølgelig have ret i - det forekom mig bare mest fikst at inkludere een gang - og så have mulighed for at kalde sub'en flere gange.

Men principielt: Burde det virke?
Avatar billede netsrac Praktikant
23. april 2002 - 11:32 #4
Tja det burde faktisk virke med en Sub, variabler i en sub er nemlig ikke private.
Avatar billede tmceu Praktikant
23. april 2002 - 11:37 #5
Jeg er både enig og uenig med netsrac. Jeg er enig i det første forslag med include filer i toppen/bunden, sådan håndterer jeg også mine database forbindelser.

Men jeg er uenig i at variablerne ikke er private (lokale). Se eks. dette udsnit af VBScript dokumentationen:

A variable's scope is determined by where you declare it. When you declare a variable within a procedure, only code within that procedure can access or change the value of that variable. It has local scope and is called a procedure-level variable. If you declare a variable outside a procedure, you make it recognizable to all the procedures in your script. This is a script-level variable, and it has script-level scope.
Avatar billede tmceu Praktikant
23. april 2002 - 11:38 #6
P.S. Eneste ulempe ved den include metode netsrac foreslår er, at hvis du eks. anvender Interdev, kan du ikke anvende IntelliSense på dine database variabler når du koder (da de er erklæret i en anden fil).
Avatar billede pollas Nybegynder
23. april 2002 - 11:38 #7
tmceu >> men er der ikke en måde at få sub'en variabel-scope udvidet lidt - synes at have gjort noget i den stil engang...
Avatar billede tmceu Praktikant
23. april 2002 - 11:39 #8
Jo, du kan erklære variablerne uden for din sub og så initialisere dem inde i sub'en.
Avatar billede netsrac Praktikant
23. april 2002 - 11:40 #9
tmceu >> Ja det var lige en forglemmelse fra min side, hvis variablen er erklæret først, vil den kunne bruges i Sub. Så du kan erklære din variabler udenfor sub´en også vil det virke. Men ta dog og brug 2 filer istedet.
Avatar billede pollas Nybegynder
23. april 2002 - 11:40 #10
Hvis man skulle være en lille performance-rytter, ville det så i øvrigt ikke være bedst at vente så længe som muligt med at åbne sin conn? Og altså ikke inkludere filen øverst på siden, men derimod køre fx en sub lige før man skal bruge sit rs?
Avatar billede pollas Nybegynder
23. april 2002 - 11:42 #11
Oh happy days - en dim inden jeg kaldte sub'en gjorde underværker :)

netsrac >> du lyder overbevist ang. de to filer - er der andre fordele jeg ikke lige har tænkt over?
Avatar billede netsrac Praktikant
23. april 2002 - 11:44 #12
pollas >> Jeg har altid selv brugt de 2 filer, men der er vel ikke nogen fordel udover at du slipper for at tænke på om du har lukket database forbindelsen igen, fordi det jo sker i filen i bunden.
Avatar billede pollas Nybegynder
23. april 2002 - 11:45 #13
netsrac >> jeg har en close-sub også :)
Avatar billede tmceu Praktikant
23. april 2002 - 11:45 #14
pollas >> du har ganske ret. Det jeg præcist gør er, at jeg har en include fil i toppen, hvor connection, connectionstring og recordset er erklæret.

Når jeg så skal bruge det, laver jeg en open på hhv. connection og recordset.

Min closedb.asp includes i bunden, og for at gøre den generisk laver jeg et check på state og lukker hvis de er åbne.
Avatar billede pollas Nybegynder
23. april 2002 - 11:46 #15
Mange tak for svarene - jeg er blevet en del klogere :)

tmceu: Hvis du vil have lidt point, så lav et svar.
Avatar billede netsrac Praktikant
23. april 2002 - 11:47 #16
pollas >> Selvfølgelig har du en close sub også, men derfor er det stadig dig der skal huske at kalde den :)
Avatar billede tmceu Praktikant
23. april 2002 - 11:47 #17
Nu kan jeg hverken købe mælk eller betale huslejen med point, men siden du nu spørger...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester