09. december 2008 - 11:57Der er
15 kommentarer og 1 løsning
Hente brugerinformationer fra SQL med function
Hej eksperter,
Jeg er igang med at prøve at finde en smart måde at finde min data på en bruger i et relativt stort site. Jeg havde planer om at lave en function som således:
Function getUser set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "xxx"
strSQL = "SELECT * FROM customers WHERE ([ID] = ?)"
set cmd = Server.CreateObject("ADODB.Command") set cmd.ActiveConnection = Conn cmd.CommandType = adCmdText cmd.CommandText = strSQL cmd.Parameters.Append cmd.CreateParameter("@ID", adVarChar, adParamInput, 255, Session("userID")) Set rs = cmd.Execute() End function
I en fil som er includet på alle sider. Og så hver gang jeg skal bruge noget fra brugeren der er logget ind kalder jeg bare denne function.
Er dette muligt? I så fald hvordan kalder jeg functionen og eks. vil have noget ud fra søjlen "name" ?
steeven > virker perfekt. men hvorfor kan jeg ikke lave navnet rs om? eks Set rs = cmd.Execute(). Fordi er det ikke uhensigtsmæssig at have flere steder connections til db kaldt rs?
Du skal bare sørge for at erklære variablen rs inde i din funktion, så er den lokal og "forstyrrer" ikke andre variable af samme navn andre steder i applikationen. Det samme gælder for variablerne strSQL, Conn og cmd.
Men igen ville jeg måske sørge for at cache navnet på en given bruger i application for at undgå for mange roundtrips til databasen for at finde de samme data. Du kunne f.eks. gøre således for en simpel cachingmodel:
Function getUser if application("username_" & session("userid")) & "" = "" then set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "xxx"
strSQL = "SELECT * FROM customers WHERE ([ID] = ?)"
set cmd = Server.CreateObject("ADODB.Command") set cmd.ActiveConnection = Conn cmd.CommandType = adCmdText cmd.CommandText = strSQL cmd.Parameters.Append cmd.CreateParameter("@ID", adVarChar, adParamInput, 255, Session("userID")) Set rs = cmd.Execute() application("username_" & session("userid")) = rs("name") getUser = rs("name") rs.close set rs = nothing conn.close set conn = nothing else getUser = application("username_" & session("userid")) end if End function
På den anden side, så kunne du også bare opbevare brugernavnet i dit sessionobjekt, da du nu alligevel har fyret op under sessions i applikationen... :-)
Tak for svarene.. Noget andet er.. med min funktionen lader jeg db'en stå åbent.. Skal jeg så hver gang jeg kalder funktionen og behandler nogle data, så evt kalde en funktion som lukker igen?
Med den funktion jeg har vist dig (din egen i en modificeret udgave) bliver forbindelse og recordset lukket (som det bør).
På en IIS 6 eller derover burde der være connectionpooling, selv for ASP-applikationer, så derfor kan du godt lukke forbindelsen ned hver gang du er færdig med den...
Application er et objekt som på linie med Session er født ind i ASP (og mange andre server-frameworks) og som kan indeholde oplysninger der skal deles på tværs af applikationens brugere. Application-objektet eksistere uden at du skal gøre noget og kan bruges uden videre (som jeg har vist i eksemplet). Måden dens Contents-collection bruges på er ligesom for session-objektet, så der er ikke noget at lære på den konto.
Man kan da argumentere imod min metode, idet brugeroplysninger jo ikke er relevante for resten af applikationen. På den anden side, så er det givetvis en resursemæssig billigere måde at opbevare oplysningerne på, end hvis du skulle oprette et sessionobjekt for hver bruger (et sessionobjekt er meget mere end bare en liste med oplysninger du selv putter i listen, dvs. den collection som hedder Session.Contents). Hvis du benytter Application.Contents i stedet, påfører du ikke serveren væsentlig mere RAM-overhead end det data fylder, så derfor kan det være en mere skalérbar metode at bruge Application frem for Sessions.
Det du går glip af ved at undlade brug af sessions, er oplysninger som Locale (LCID), sessionid, samt andre session-specifikke "behageligheder" (f.eks. at du får besked om at en session er startet og udløbet i global.asa). At du kan sætte tiden for hvorlænge en session skal "leve" (uden brugeren forespørger den) inden den dør automatisk, kan simuleres ved at sætte expires på en cookie i stedet.
hvis brugernavnet ikke cached endnu så hent brugernavnet fra databasen gem det i cachen return brugernavnet i funktionens navn ellers hent brugernavnet fra cachen og returner det i funktionens navn slut hvis
softspot > igen skal du have mange tak for hjælpen. Dog oplever jeg stadig en fejl. Hvis vi ser bort fra dit eksempel og jeg manuelt lukker forbindelsen hver gang, eller eks. ved at kalde en funktion som lukker. Så bliver jeg ved med at få fejlen "Operation is not allowed when the object is open." når der prøves at åbne databasen andre steder på siden.
Hvis du efterlader forbindelsen åben, så skal den jo heller ikke åbnes igen...(?)
Du kan evt. checke på om forbindelsen er oprettet ved dels at undersøge om objektet er instantieret og om state er forskellig fra closed. Nogenlunde således:
' Forventer at conn er en global variabel! sub ensureOpenConn() dim openConn, newConn
openConn = false newConn = isempty(conn) if not newConn then newConn = not isObject(conn) if not newConn then newConn = not conn is nothing if not newConn then openConn = conn.state = vbStateClosed end if end if end if
if newConn then set conn = Server.CreateObject("ADODB.Connection") openConn = true end if
if openConn then conn.Open "xxx" end if end sub
' Kald funktionen der søger for at connection er oprettet og åben ensureOpenConn
vbStateClosed hedder nok adStateClosed, og så kræver det givetvis at metadata-elementet er inkluderet i siden eller at adovbs.inc er inkluderet i siden (for at få fat i konstanten adStateClosed).
som enten lægges i global.asa (hvis du ikke gider tænke på det mere), alternativt i toppen af den asp-fil som benytter ADO-konstanter.
Synes godt om
Slettet bruger
04. juli 2010 - 00:07#16
Skal vi se at få lukket spørgsmålet...
Synes godt om
Ny brugerNybegynder
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.