Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[VB/SQL] Tabel bijwerken vanuit twee programma's

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb twee VB-programma's geschreven die allebei de volgende code gebruiken om instellingen in een Access 2000 database weg te schrijven:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Sub SaveDBSetting(strKey As String, varValue As Variant)

    Dim rstTemp As Recordset

    Set rstTemp = dtbDatabase.OpenRecordset("tblConfig", dbOpenDynaset, 0, dbOptimistic)
    With rstTemp
        .FindFirst "[Key] = """ & strKey & """"
        If .NoMatch Then
            .AddNew
        Else
            .Edit
        End If
        !Key = strKey
        !Value = varValue
        .Update
    End With

End Sub


Dit gaat een tijdje goed, maar uiteindelijk geeft altijd één van de twee programma's de volgende foutmelding: '3260: Bijwerken is niet mogelijk. Het object wordt momenteel gebruikt door de gebruiker ... en is vergrendeld.'
Ik dacht dat het toevoegen van 'dbOptimistic' aan de 'OpenRecordset'-regel dit probleem wel zou verhelpen...maar niet dus. :( Tis vooral vreemd omdat de programma's totaal verschillende rijen proberen bij te werken.
Iemand een idee hoe ik dit op kan lossen?

Verwijderd

LockOptimistic houdt in dat tijdens jouw geschrijf anderen kunnen LEZEN (lockpessimistic houdt ook dat tegen). 2 keer schrijven lukt echter niet tegelijk! Access heeft geen rowlocking (wel in Jet4.0, download SP6 voor Jet4.0 van de windows update site) dus lockt de gehele tabel. Probeer dat SP6 voor Jet4.0 en als het goed is is je locking probleem verdwenen.

Verwijderd

Topicstarter
Bedankt Otis, die Service Pack werkt inderdaad! 8)

Toch denk ik dat ik m'n code een beetje ga beveiligen door er een 'On Error' statement in te pleuren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Sub SaveDBSetting(strKey As String, varValue As Variant)

    Dim rstTemp As Recordset

    Set rstTemp = dtbDatabase.OpenRecordset("tblConfig", dbOpenDynaset, 0, dbOptimistic)
    With rstTemp
        .FindFirst "[Key] = """ & strKey & """"
        If .NoMatch Then
            .AddNew
        Else
            .Edit
        End If
        !Key = strKey
        !Value = varValue
        On Error GoTo CannotUpdate
        .Update
    End With
    Exit Sub
    
CannotUpdate:
    Sleep 200
    Resume

End Sub


Dit zou toch wel voldoende moeten zijn? :) (de Sleep functie komt trouwens uit de Win32 API)

Verwijderd

Die On Error zou ik bovenin zetten, een sleep kan nuttig zijn, maar ADO heeft zelf al een timer wanneer iets gelockt is. Je zou de timeout wat hoger kunnen zetten op de connection (even help bekijken) zodat je minder snel een timeout krijgt wanneer iets gelockt is. (staat default op 3 seconden dacht ik)

Verwijderd

Toch denk ik dat ik m'n code een beetje ga beveiligen door er een 'On Error' statement in te pleuren:
offtopic:
waarom doe je dit niet standaard ???? hoe beveilig je je code anders tegen crashen ??

Verwijderd

Topicstarter
Je hebt helemaal gelijk Skizmo, maar ik gebruik VB6 vooral om snel kleine programmaatjes voor eigen gebruik in elkaar te zetten, waardoor ik meestal niet de aandacht vestig op foutafhandeling. Die 'On Error'-methode vind ik namelijk nogal een ramp om te implementeren: doe mij maar exceptions (zoals in bijv. VB.NET).
Pagina: 1