webForumDet fria alternativet

Hur skulle man kunna strukturera upp en databasavdelning?

ASP

16 svar · 277 visningar · startad av Lukaspojken

Medlem sedan maj 20011 312 inlägg
Frågan#1

Hur skulle man kunna strukturera upp alla databashämtningar på en viss del i koden, dvs att man samlar alla databashämtningar på en plats och använder variabler sen?

------------------
Alltid lär man sig något nytt varje dag...

Medlem sedan juni 20019 024 inlägg
#2

Hmmmm... konstig fråga, men om jag har fattat dig rätt så ska PatrikB:s zPaging II göra det du begär, dvs läsa in allt genom getRows().

http://script.webforum.nu/wf/Forum1/HTML/000063.html

------------------
Peter D

Medlem sedan maj 20011 312 inlägg
#3

Känner att jag är lite otydlig men det känns lite som databasavdelning i koden är en ny sak kanske. Ska försöka exemplifiera vad jag menar.

Jag har 5 databashämtningar/SQL-frågor på en sida.

Databasavdelning

Set Connect = Server.CreateObject("ADODB.Connection")
SQL-fråga 1
Array1
SQL-fråga 2
Array 2
...
SQL-fråga 5
Array 5
Connect.Close
Set Connect = nothing

Efter att jag gjort alla hämtningar i databasavdelningen så kan jag bara nu använda mig av arrays. En databasavdelning borde öka prestandan.

Ska försöka exemplifiera hur jag gör idag:

Html-kod

Set Connect = Server.CreateObject("ADODB.Connection")
SQL-fråga 1
array1
Connect.Close
Set Connect = nothing

HTML-kod och använda array1

Set Connect = Server.CreateObject("ADODB.Connection")
SQL-fråga 2
array2
Connect.Close
Set Connect = nothing

etc.

När man arbetar på ett sådant här sätt utan en databasavdelning så förlorar man väldigt mycket prestanda eftersom man får återskapa connect 5 gånger. Med en databasavdelning så räcker det med att skapa connect 1 gång och sen behöver man den inte mer. Förstår du hur jag menar?

------------------
Alltid lär man sig något nytt varje dag...

Medlem sedan juni 20019 024 inlägg
#4

Japp, jag förstår ... men vad var frågan (du tycks ju ha besvarat den själv) ??

------------------
Peter D

Medlem sedan juni 200032 967 inlägg
#5

jag vet inte, men det känns lite som att du vill gå över ån för vatten. mitt förslag är som följer:

skapa ditt connection-objekt så sent som möjligt innan första användning. låt sedan det objekt vara levande, och förstör det så fort som möjligt efter sista användning.

det känns väldigt onödigt att skapa och förstöra objekt i onödan på detta sätt.

du kan visserligen baka ihop allt högst upp på sidan om du vill, och därmed vinna en del i struktur på sidan. jag, till exempel, blir gääälen när jag går igenom kod som är huller om buller.

dock får man tänka på att det kan ju faktiskt vara lättare att förstå vad man håller på med om sql-frågor ställs i anslutning till dess användning.

det är inte nu du ska veta vad du håller på med, utan sedan, när du glömt vad du hållt på med nu.

endast en amatörs synpunkter.

mvh,

------------------
<A HREF="http://cartman.nu" TARGET=_blank>
can i borrow your goat?
</A>

Medlem sedan maj 20011 312 inlägg
#6

Man kan ju kommentera array längre ner där den används likt

array1 'strSQL = "Select * blabla"

Anledningen för att jag tänker på en databasavdelning är att jag vill baka in så mycket på en sida som möjligt. Men det kan nog ligga något i det du säger @nders att en sådant databasavdelning skulle göra andra helt gällna när de såg en sådan....:)

Pace: Jag tänkte lite mer programmeringsmässigt hur den översta skulle se ut. Skulle nån liknande main variant fungera med case-satser?

------------------
Alltid lär man sig något nytt varje dag...

Medlem sedan juni 20019 024 inlägg
#7

Om du förklarar exakt vad du vill plocka ut så är det nog lättare för oss/mig att förstå.

------------------
Peter D

Medlem sedan mars 20002 836 inlägg
#8

Håller med @nders.
Skapa ett connection objekt precis innan du öppnar databasen för första hämtningen och stäng det direkt efter sista hämtningen.

Svaret har du från Emission i ditt inlägg: http://cgi.webforum.nu/wf/Forum11/HTML/005366.html

en funktion som kan inkluderas på alla sidor som behöver komma åt dbn.

cya,
PatrikB

------------------
*Det tar sig sa han som hade eld i håret*

Medlem sedan maj 20011 312 inlägg
#9

Jag förstår dock inte skillnaden på min sub och funktionen...vad är det för bra att ha en funktion så som emission har. varför inte ha en sub som jag? förstår inte riktigt...:)

------------------
Alltid lär man sig något nytt varje dag...

Medlem sedan maj 20011 312 inlägg
#10

Tack vare dig gick jag igenom mina db-kopplingar och såg att jag kunde göra två av dessa kopplingar till statiska. Det var enormt smart att bygga upp statiska include-variabler (för tex dagens citat).

------------------
Alltid lär man sig något nytt varje dag...

Medlem sedan dec. 19996 721 inlägg
#11

Jag förstår dock inte skillnaden på min sub och funktionen...vad är det för bra att ha en funktion så som emission har. varför inte ha en sub som jag? förstår inte riktigt...:)

Fördelen är att man kan hämta in kopplingen precis när den behövs, och få den lokalt i den subrutin som anropar den. Med en sub måste man göra db-kopplingen global (alt. skapa kopplingen lokalt och låta subben öppna den), vilket också gör att man måste hålla reda på vad det är för koppling, och vad den heter. Måhända inget större problem, kan tyckas, men för mig är function-varianten den bästa.

Medlem sedan juni 2000690 inlägg
#12

Det bror väl lite på vad man skall ha ut. Angående ursprungsfrågan alltså...

Jag använder en liknande teknik i länksamlingen på bengan.com.

Öppnar connection

- Kör ut ett recordset till array (Getrows) med alla länkar i för den kategorin.
- Stänger recordsetet
- Kör ut ett recordset (ny tabell) till ny array med alla undermappar i den mapp man är i.
- Återanvänder samma recordset i en rekursiv funktion för att loopa ut navigeringen till en tredje array
- Stänger recordsetet.

Stänger connection

Loopar ut arrayen baklänges för navigeringen.

Loopar ut arrayen med undermappar.

Loopar ut arrayen med länkar.

För mig gjorde det här rätt mycket för prestandan. Om det sen är rätt eller inte vetefan :)
Men helt klart får man vara noga med att skriva lite förklaringar här o var. Jag tar även ut värdet i arrayen till en variabel innan utskrift så ser man lättare vad som är vad.

------------------
MvH
/Bengan
www.bengan.com | Brossans Räjser
"Better to be hated for who you are than loved for who you're not."

[Redigerat av Bengan den 24 jul 2001]

Medlem sedan maj 20011 312 inlägg
#13

Behöver man inte göra en funktion global? Min sub ser ut så här:

Sub DB_koppling		'Databas-kopplingen istället för include
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=minDB.mdb"
End Sub

Hur skulle jag göra med en funktion om jag inte gör den global? Var sätter jag funktionen?

------------------
Alltid lär man sig något nytt varje dag...

Medlem sedan maj 20011 312 inlägg
#14

Bengan: Det finns ett ställe i koden på ungefär 200 kodrader som db-kopplingen är öppen. Det är ett forum, när man klickar på ett huvudinlägg så ska det visas (en hämtning), huvudinlägget ska visas som länk (en annan hämtning), underinläggen ska visas (ytterligare en hämtning). Jag tror jag skulle kunna tjäna in lite prestanda där om jag gjorde alla tre hämtningar först och sen använde mig av variablerna.

------------------
Alltid lär man sig något nytt varje dag...

Medlem sedan juni 2000690 inlägg
#15

Ja, man får ju alltid väga in hur mycket effekt en optimering gör och i ditt fall skulle det nog kunna göra en del.

För mig gjorde det mycket. Tidigare användes gamla hederliga sättet att loopa och skriva ut recordseten direkt. Trots att jag hade databasen öppen så kort tid som möjligt så blev det en del kod att köra innan den stängdes...

När jag gick över till att använda getrows mm så minskade exekveringstiden med typ 300%, ännu mer vid rusningstrafik.
Gick iofs över till MySQL med sen så lite svårt att veta vilken skillnaden skulle vara nu.

------------------
MvH
/Bengan
www.bengan.com | Brossans Räjser
"Better to be hated for who you are than loved for who you're not."

Medlem sedan dec. 19996 721 inlägg
#16

Behöver man inte göra en funktion global?

Jo, en Function är alltid global (om den inte är en metod i en Class), men det resultat man får från den hamnar ju i det scope som den används i, dvs. om jag hämtar in kopplingen i en sub, så finns den bara där (om man inte dimmat kopplingen utanför subbarna). Prestandamässigt är det en försumbar vinst, men det ger mer kontroll.

Den stora prestandaförlusten är den ständigt uppkopplade databasen, och det löser man genom getrows, eller ännu smidigare med CursorLocation=adUseClient.

Medlem sedan maj 20011 312 inlägg
#17

Så med en sub har jag connection öppen hela filen rakt igenom?

Jag förstår fortfarande inte riktigt men jag litar på dig emission. Ska använda mig av en sådan funktion istället.

------------------
Alltid lär man sig något nytt varje dag...

264 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
118 ms — ändringar (db)