Toon posts:

[ASP] Connectie Database lost

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wij hebben een script geschreven dat statistieken kan bijhouden van verschillende nieuwsitems per dag. Dat betekent dat we een aparte tabel hebben nieuws_statistieken.
Deze heeft een veld ID, Datum, Views, Clicks, NieuwsID. Nu heb ik een constraint tussen ID, en Datum.

Daarbij hebben we een functie geschreven die er alsvolgt uitziet.

Updaten voor view
function UpdateView(AgendaItemID, ComponentNaam, ComponentTitel, PresentatieID)
On error resume next
ExecuteQuery "INSERT INTO TBL_AgendaStatistieken (AgendaItemID, Datum, Views, Clicks, ComponentNaam, ComponentTitel, PresentatieID) VALUES (" & AgendaItemID & ",CONVERT(datetime, CONVERT(char(10), GETDATE(), 120)),0,0,'"& ComponentNaam & "',' " & replace(ComponentTitel,"'","''") & "',0" & PresentatieID & ")"

ExecuteQuery "UPDATE TBL_AgendaStatistieken SET Views=Views+1, ComponentNaam = '"& ComponentNaam&"', ComponentTitel = '"& replace(ComponentTitel,"'","''")&"', PresentatieID =0 " & PresentatieID & " Where AgendaItemID=0" & AgendaItemID & " AND Datum= CONVERT(datetime, CONVERT(char(10), GETDATE(), 120))"
on error goto 0
end function

Execute Query is een functie die connectie maakt met de database en de Query uitvoert en daarna de connectie weer netjes sluit. De functie updateview wordt op zijn beurt weer aangeroepen door de pagina waar de nieuwsitems worden geladen. Dus per te laden nieuws item ga ik een view updaten of inserten. Mocht er al een id met datum bestaan dan wordt er geupdate (on error resume next) en niet geinsert.

Alleen na verloop van tijd worden de pagina uitermate traag. Is er misschien een diepe instelling in de db die dit kan verhelpen, of is dit een code probleem, en hoe deze op te lossen?

  • arieleks
  • Registratie: September 2002
  • Laatst online: 13-08-2013
Hmmm, is het wel zo'n goed idee om ExecuteQuery iedere keer een connectie te laten open en sluiten voor elke query?

- Rietberg - sieben Mal sympatisch -

There are only 10 types of people, those who make stupid jokes about binary numbers and those who don't.


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 20:39

TeeDee

CQB 241

VBScript:
1
2
3
4
5
6
7
function UpdateView(AgendaItemID, ComponentNaam, ComponentTitel, PresentatieID)
On error resume next
ExecuteQuery "INSERT INTO TBL_AgendaStatistieken (AgendaItemID, Datum, Views, Clicks, ComponentNaam, ComponentTitel, PresentatieID) VALUES (" & AgendaItemID & ",CONVERT(datetime, CONVERT(char(10), GETDATE(), 120)),0,0,'"& ComponentNaam & "',' " & replace(ComponentTitel,"'","''") & "',0" & PresentatieID & ")"

ExecuteQuery "UPDATE TBL_AgendaStatistieken SET Views=Views+1, ComponentNaam = '"& ComponentNaam&"', ComponentTitel = '"& replace(ComponentTitel,"'","''")&"', PresentatieID =0 " & PresentatieID & " Where AgendaItemID=0" & AgendaItemID & " AND Datum= CONVERT(datetime, CONVERT(char(10), GETDATE(), 120))"
on error goto 0
end function


Er zitten imo een aantal rare zaken in:
Op basis van een mogelijke fout ga jij inserten of updaten. Dat lijkt me niet helemaal 'the way to go'. Ten 2e is het hele convert verhaal in je queries nu imo ook niet de allerbeste oplossing.

Je zou beter ExecuteQuery om kunnen schrijven met een aantal paramaters.
code:
1
2
3
4
function ExecuteQuery(bool IsInsert, string Param1, string Param2 etc. etc.)
//op basis van de bool IsInsert bepalen of het een insert of een update moet zijn
//op deze manier open je de connectie maar 1x.
end function

Ik kan me voorstellen dat zodra je in het on error gedeelte komt, de connectie naar de DB open blijft.

Desnoods bak je er ook nog een Sproc of iets dergelijks van.

Nu weten wij natuurlijk niet welke RDBMS gebruikt, dus dat is even daar van afhankelijk.

Punt is: als je in een error schiet, dan blijft vziw je connectie open en wordt er nog één geopend.

[ Voor 8% gewijzigd door TeeDee op 23-11-2006 10:59 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Verwijderd

Verwijderd schreef op donderdag 23 november 2006 @ 10:45:
Dus per te laden nieuws item ga ik een view updaten of inserten. Mocht er al een id met datum bestaan dan wordt er geupdate (on error resume next) en niet geinsert.
Sluit bij een error die ExecuteQuery z'n connection wel netjes?

Bovendien lijkt me een 'on error resume next' wel erg ranzig. Niet alleen in dit geval, maar in het algemeen.
ADO, ODBC, en vrijwel iedere andere database client, geven bij het uitvoeren van een query terug hoeveel rows er affected zijn. Als je de ExecuteQuery functie die waarde laat returnen, en je probeert eerst de update, en als het result 0 is (0 rows affected, oftewel row bestaat nog niet) de insert uitvoert, ben je niet meer afhankelijk van exceptions om de flow van je routine te bepalen.