Avatar billede krogstrup Nybegynder
05. juli 2004 - 09:25 Der er 8 kommentarer og
3 løsninger

Åbne database til skrivning og låse så andre ikke skriver imens

Jeg benytter nedenstående funktion til at opdatere databasen med noget statistik optælling:

function simpleStats(siteID)
    strSQL = "SELECT * FROM sites WHERE sites_id = " & siteID
    Set rs = Server.CreateObject("ADODB.RecordSet")
    rs.Open strSQL, dsn_procms, 1, 3

    if rs("sites_counter_sessions") = "" or rs("sites_counter_sessions") = null then
        rs("sites_counter_sessions") = 0
    end if

    if rs("sites_counter_hits") = "" or rs("sites_counter_hits") = null then
        rs("sites_counter_hits") = 0
    end if

    if not session("counted") then
        rs("sites_counter_sessions") = rs("sites_counter_sessions") + 1
        session("counted") = true
    end if

    rs("sites_counter_hits") = rs("sites_counter_hits") + 1

    rs.Update
    rs.Close
    set rs = Nothing
end function


Men når der er mange brugere på mit site, får jeg nedenstående fejl:


Microsoft JET Database Engine error '80040e21'

The Microsoft Jet database engine stopped the process because you and another user are attempting to change the same data at the same time.

/includes/asp/functions.asp, line 101


Linie 101 er denne:

rs.Update


Hvordan åbner jeg databasen på en måde, at andre brugere må stå i "kø" for at kommme til at kunne skrive til den, så jeg ikke får ovenstående fejl med flere brugere der forsøger at ændre samme data på samme tid ?
Avatar billede tofte Juniormester
05. juli 2004 - 13:24 #1
Mener at jeg engang har løst et lignende problem ved at bruge
rs.Open strSQL, dsn_procms, 1, 2 i stedet for 3. Det er en lidt hårde lås. Men det kan være jeg tager fejl.
Avatar billede krogstrup Nybegynder
07. juli 2004 - 12:19 #2
hmmm - er der ikke nogen der ligge inde med lidt dokumentation om emnet ?
Avatar billede lkekspert Nybegynder
07. juli 2004 - 23:53 #3
Et recordset kan etableres med en hård/restriktiv lock (adLockPessimistic) eller med en mindre restriktiv lock (adLockOptimistic). Forskellen ligger i, at adLockPessimistic låser record når selve editeringen starter, og frigiver igen når Update kaldes. Hvorimod adLockPessimistic kun låser record når Update kaldes.

Nedenstående er en anelse mere sigende end blot tal. Det er den fjerede parameter du skal være opmærksom på (adLockPessimistic). Som

objRS.Open "tblBrugere", objConn, adOpenForwardOnly, adLockPessimistic, adCmdTable

Lars
Avatar billede krogstrup Nybegynder
08. juli 2004 - 08:50 #4
hej Lars

tak for dit svar. Da jeg ikke inkluderer den fil der laver ovenstående konstanter (f.eks. AdOpenForwardOnly) er jeg pt. nødt til at bruge tallene.

Ved du hvilket nr. adLockPessimistic har ?
Avatar billede lkekspert Nybegynder
08. juli 2004 - 09:33 #5
vent lige..... :-)
Avatar billede lkekspert Nybegynder
08. juli 2004 - 09:35 #6
'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4

Lars
Avatar billede lkekspert Nybegynder
08. juli 2004 - 09:43 #7
Du har det også på din egen computer under drev:\programmer\fælles filer\System\ado\adovbs.inc - det er herfra jeg har taget en kopi. Det er altså en laaang række konstanter defineret til VBScript. Jeg synes det er en god at inkludere filen for læsbarhedens skyld, men det er vel en temperamentssag :-)

Lars
Avatar billede lkekspert Nybegynder
08. juli 2004 - 09:56 #8
Hej :-)

I dine sql-sætninger selecter du en produktKategori. Det er en attributnavn i databasen.

sql = "SELECT produktKategori, COUNT(produktKategori) AS majorCategories "
sql = sql & "FROM produktKatalog GROUP BY produktKategoril ORDER BY produktKategori;"

..jeg bliver lidt mistænkelig da du overfor tildeler en variabel, displayField, en tekststreng "produktKategori":
displayField = "produktKategori"

.. produktKategori i din sql-sætning er IKKE en tekststreng, men en attribut i din database. Hvis din sql-sætning skal være korrekt semantisk - så skal du have en attribut i din produktKatalog tabel, der hedder produktKategori.

Jeg har ikke læst videre i din kode, da det her virker som en fejl.

De bedste hilsner
Lars
Avatar billede lkekspert Nybegynder
08. juli 2004 - 10:01 #9
For søren, det var den forkerte tråd - undskyld..
Avatar billede krogstrup Nybegynder
08. juli 2004 - 10:02 #10
hehe - helt i orden (du havde ellers fået mig godt forvirret, da jeg læste dit sidste svar)

lol :-)
Avatar billede krogstrup Nybegynder
08. juli 2004 - 10:05 #11
tak for din svar !
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
Kurser inden for grundlæggende programmering

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