[AccessD] Dubious value

John Colby jwcolby at ColbyConsulting.com
Wed Feb 15 08:50:36 CST 2006


>From the following blog:

http://blogs.msdn.com/michkap/archive/2005/10/19/482694.aspx

There is the Jet 4.0 feature of record level locking that people love, so I
will talk about that.

Now the rule is that once the database is opened (by anybody), that is the
mode of the datasbase until all user are out of it; this makes sense since
locking schemes have to apply to all concurrent users to have any meaning.

So what this means is that the Access setting in the Tools|Options Advanced
tab (the chekbox "Open databases using record-level locking") is a request,
not a demand. If the database is already opened in the other mode, your open
will not fail, and with the current design you are not even warned that your
preference was not heeded since your request could not be honored.

But two additional warnings that you my find useful here exist:

    * 3811 -- Attempt to open the datasbase with the requested record level
locking failed; page level locking will be used
    * 3812 -- Attempt to open the datasbase with the requested page level
locking failed; record level locking will be used

What this means is that if in your database you run the following code after
it is open:

    Set con = New ADODB.Connection
    con.Provider = "Microsoft.JET.OLEDB.4.0"
    con.Properties("Data Source") = CurrentDb.Name
    con.Properties("Jet OLEDB:Database Locking Mode") = 1 ' use 0 for page
level check
    con.CursorLocation = adUseServer
    con.Open

and the database was not in the mode you asked for tht you will see one of
those warnings in the NativeError property, right in
con.Errors(0).NativeError! You will see one of the following values
(depending on whether you set the locking mode to 0 or 1 in the code) if
there is something in that collection (on 100% success it will be empty):

    * 249761507 -- Warning 3811 above (in hex it is 0x0ee30ee3, and 0x0ee3
is indeed 3811)
    * 249827044 -- Warning 3812 above (in hex it is 0x0ee40ee4, and 0x0ee4
is indeed 3812)

So it is as simple as that. You can obviously combine this with an
Application.GetOption("Use Row Level Locking") to see if the user running
the code is the cause of the problem so you can kick them out or whatever.
This becomes a much cooler way to solve problems such as those documented in
KB article 237333, which just tells people to change the setting in Access
and does not help people to fix the problem of the fact that it is not
always that user's settings which are causing the problem....


************************

As always happens however... When I try and use that code, none of the above
errors occur, rather I get a message:

"the database has been placed in a state that prevents it from being opened
or locked"

I thought I would use this code to troubleshoot locking issues since I have
several clients where locking is an issue.  Can anyone look at the code and
comment on why I would not get the indicated error?

I am (for now) just running the code inside of my framework, standalone.

John W. Colby
www.ColbyConsulting.com 





More information about the AccessD mailing list