Avatar billede s0mmer Nybegynder
09. december 2008 - 11:57 Der 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" ?
Avatar billede Slettet bruger
09. december 2008 - 12:04 #1
Gør det som du siger med at lave en fil, der åbner ind til databasen, og lav et include på siderne, hvor det skal bruges.

Du henter vel sagtens data (fx fra cellen "name") fra databasen ved at skrive:
    rs("name")

Du har jo netop lavet en SQL-forespørgsel, hvor du henter data vha. SELECT.

  // Steeven
Avatar billede s0mmer Nybegynder
09. december 2008 - 12:05 #2
men skal funktionen ikke køres?
Avatar billede Slettet bruger
09. december 2008 - 12:06 #3
Og forresten: du kalder din funktion ved blot at skrive getUser() i ASP'en.
Avatar billede s0mmer Nybegynder
09. december 2008 - 12:12 #4
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?
Avatar billede softspot Forsker
09. december 2008 - 12:20 #5
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.
Avatar billede softspot Forsker
09. december 2008 - 12:26 #6
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... :-)
Avatar billede s0mmer Nybegynder
09. december 2008 - 12:57 #7
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?
Avatar billede softspot Forsker
09. december 2008 - 13:12 #8
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...
Avatar billede s0mmer Nybegynder
09. december 2008 - 13:21 #9
softspot > okay, men kan du forklare din metode? jeg forstår den ikke helt.. altså, hvor komme application fra?
Avatar billede softspot Forsker
09. december 2008 - 13:32 #10
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.
Avatar billede softspot Forsker
09. december 2008 - 13:47 #11
Forklaringen til selve metoden er (i pseudokode):

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
Avatar billede s0mmer Nybegynder
09. december 2008 - 14:00 #12
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.
Avatar billede softspot Forsker
09. december 2008 - 14:11 #13
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
Avatar billede softspot Forsker
09. december 2008 - 17:59 #14
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).
Avatar billede softspot Forsker
09. december 2008 - 18:00 #15
og det metadata-element jeg refererer til er:

<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->

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.
Avatar billede Slettet bruger
04. juli 2010 - 00:07 #16
Skal vi se at få lukket spørgsmålet...
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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