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?
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?
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.
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?
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...:)
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).
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.
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.
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?
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.
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.
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.