[AccessD] LDBView

MartyConnelly martyconnelly at shaw.ca
Thu Jun 29 13:13:54 CDT 2006


 Some of those character strings returned by UserRoster are of C Type 
zero length
and you have to step through chararacter by character and handle nulls 
yourself
Here is an example I wrote years ago in 97 using ADO maybe it helps or 
gives hints.
There is also code to give ISAM stats

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=28652&lngWId=1

basic guts

 How to determine what users are connected to your Access database
and the machine name that it is connected to. This uses the  Jet OLE DB
Provider Defined Schema Rowsets Constants
Global Const JET_SCHEMA_USERROSTER =  "{947bb102-5d43-11d1-bdbf-
00c04fb92675}"
This avoids having to install the Msldbusr.dll provided with
the ldbviewer. Although you will need at least MDAC ADO 2.5 installed
to use this method. For ldbviewer see:
http://support.microsoft.com/support/kb/articles/Q176/6/70.ASP

 Why do you need this? Often users will leave a database open and
you will need to shut it down for maintenance, this will tell you
which terminal or PC has it open as well as the User name. You won't
have to wander from office to office  to see which terminal has been left
with the database open. It will also tell who's terminal has powered down
with database open.

' Constants
'
'The Microsoft Jet Provider defines a number of GUIDs
'and property values that are for provider-specific features
'and properties. Because they are provider-specific values,
'ADO does not expose them in enumeration values or constants
' for further info see:
' http://www.microsoft.com/data/ado/adotechinfo/dao2ado_9.htm
' http://msdn.microsoft.com/library/techart/daotoadoupdate_topic10.htm

'Remember to set reference to MS ADO 2.5 or higher

' Jet OLE DB Provider Defined Schema Rowsets Constants

Global Const JET_SCHEMA_USERROSTER = _
    "{947bb102-5d43-11d1-bdbf-00c04fb92675}"
Global Const JET_SCHEMA_ISAMSTATS = _
    "{8703b612-5d43-11d1-bdbf-00c04fb92675}"

'        Microsoft Jet OLEDB:Database Locking Mode property values
Global Const JET_DATABASELOCKMODE_PAGE = 0
Global Const JET_DATABASELOCKMODE_ROW = 1
'Remember to set reference to MS ADO 2.5 or higher
' sample calls
'
'ADOUserRoster "C:\Program Files\Microsoft
Office\Office\Samples\Northwind.mdb"
'ADOUserStats  "C:\Program Files\Microsoft
Office\Office\Samples\Northwind.mdb"

Function ADOUserRoster(strAccessMDBName As String) As String
 Dim cnn As New ADODB.Connection
 Dim rst As ADODB.Recordset
 Dim varGetString As Variant
 ' Use before ADO calls
   On Error GoTo AdoError
   ' Open the connection
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
       "Data Source=" & strAccessMDBName & ";"
   ' Open the user roster schema rowset
   Set rst = cnn.OpenSchema(adSchemaProviderSpecific, , _
      JET_SCHEMA_USERROSTER)
   ' Print the results to the debug window
'Column Description
'COMPUTER_NAME The name of the workstation as specified using
'              the Network icon in Control Panel.
'LOGIN_NAME The name of the user used to log on to the database
'             if the database has been secured; otherwise,
'             the default value will be Admin.
'CONNECTED True, if there is a corresponding user lock
'                  in the .ldb file.
'SUSPECTED_STATE True, if the user has left the database
'                 in a suspect state; otherwise, Null.

Debug.Print "Computer Name   Login Name" & _
            "       Connected  Suspected State"
'can only grab once
'Use all defaults: get all rows, TAB column delimiter, CARRIAGE RETURN
'row delimiter, empty-string null delimiter

varGetString = rst.GetString(adClipString, , ",", ";", "?")

'computer name string has a couple of nulls in so remove
Dim ab() As Byte
Dim i As Long
Dim lstrlen As Long
lstrlen = (Len(varGetString) - 1) * 2

ab = varGetString
For i = 0 To lstrlen Step 2

Debug.Print Chr(ab(i)); ab(i); i
If ab(i) = 0 Then
  ab(i) = 32
  End If
Next i
' Format string for text box
varGetString = ab
varGetString = Replace(varGetString, ",0,", ", False   ,")
varGetString = Replace(varGetString, ",-1,", ", True    ,")
varGetString = Replace(varGetString, ",?", ",      ?? ,")
varGetString = Replace(varGetString, ",", "    ")
varGetString = Replace(varGetString, ";", vbCrLf)

Debug.Print varGetString

 ADOUserRoster = "Computer Name   Login Name" & _
                   "       Connected  Suspected State" & vbCrLf & _
                   varGetString
   cnn.close
   Set cnn = Nothing
  Exit Function
' ADO Error/Exception Handler
AdoError:
  Dim ErrNumber As Long
  Dim ErrSource As String
  Dim ErrDescription As String
   ErrNumber = Err.Number
   ErrSource = Err.Source
   ErrDescription = Err.Description
   AdoErrorExpanded cnn
   cnn.close
   Set cnn = Nothing
'where Cnn is  Connection Object

End Function
Function ADOUserStats(strAccessMDBName As String) As String
' Grab Isam Statistics at call time
' Write up in Microsoft Jet Dabase Programmer's Guide
' similar to ISAMStats function
' IsamStats(StatNum as Long,Reset as Boolean)
 Dim cnn As New ADODB.Connection
   Dim rst As ADODB.Recordset
   Dim strLine As String
   Dim i As Integer
   Dim strLargeLine As String
   ' Use before ADO calls
   On Error GoTo AdoError

   ' Open the connection
   cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & strAccessMDBName & ";"
   ' Open the user roster schema rowset
   Set rst = cnn.OpenSchema(adSchemaProviderSpecific, , _
             JET_SCHEMA_ISAMSTATS)
   ' Print the ISAM Stats results to the debug window

Debug.Print "ISAM Stats"
strLargeLine = "ISAM Stats" & vbCrLf
   Debug.Print rst.GetString

With rst
  .MoveFirst
  Do While Not .EOF

    strLine = ""
    With .Fields
     Debug.Print "Count=" & .Count
      For i = 0 To .Count - 1
        strLine = strLine & .Item(i).Name & ":" & _
                      .Item(i).Value & vbCrLf

      Next
        Debug.Print strLine
        strLargeLine = strLargeLine & strLine & vbCrLf
     End With
   .MoveNext
  Loop
  End With

  ADOUserStats = strLargeLine
   cnn.close
   Set cnn = Nothing
    Exit Function
' ADO Error/Exception Handler
AdoError:
  Dim ErrNumber As Long
  Dim ErrSource As String
  Dim ErrDescription As String
   ErrNumber = Err.Number
   ErrSource = Err.Source
   ErrDescription = Err.Description

   AdoErrorExpanded cnn
   cnn.close
'where Cnn is  Connection Object
End Function

Sub AdoErrorExpanded(Conn1 As ADODB.Connection)
' ADO Error/Exception Handler Expanded
   Dim Errs1 As ADODB.Errors
   Dim errLoop As ADODB.Error
   Dim i As Long
   Dim strMsgErr As String

   i = 1
   On Error Resume Next

   ' For any error condition, show results in debug
   ' Enumerate Errors collection and display properties
   '                  of each Error object.
   Set Errs1 = Conn1.Errors
   For Each errLoop In Errs1

      With errLoop
         Debug.Print " Error #" & i & ":"
         Debug.Print "   ADO Error   #" & .Number
         Debug.Print "   Description  " & .Description
         Debug.Print "   Source       " & .Source
         Debug.Print "   HelpFile     " & .HelpFile
         Debug.Print "   HelpContext  " & .HelpContext
         Debug.Print "   NativeError  " & .NativeError
         Debug.Print "   SQLState     " & .SQLState

         strMsgErr = " Error #" & i & ":"
         strMsgErr = strMsgErr & vbCrLf & "   ADO Error   #" & .Number
         strMsgErr = strMsgErr & vbCrLf & "   Description  " & .Description
         strMsgErr = strMsgErr & vbCrLf & "   Source       " & .Source
         strMsgErr = strMsgErr & vbCrLf & "   HelpFile     " & .HelpFile
         strMsgErr = strMsgErr & vbCrLf & "   HelpContext  " & .HelpContext
         strMsgErr = strMsgErr & vbCrLf & "   NativeError  " & .NativeError
         strMsgErr = strMsgErr & vbCrLf & "   SQLState     " & .SQLState
         MsgBox strMsgErr
         i = i + 1
      End With
   Next
With Conn1
Debug.Print "ADO Version: " & .Version & vbCrLf & _
"DBMS Name: " & .Properties("DBMS Name") & vbCrLf & _
"DBMS Version: " & .Properties("DBMS Version") & vbCrLf & _
"OLE DB Version: " & .Properties("OLE DB Version") & vbCrLf & _
"Provider Name: " & .Properties("Provider Name") & vbCrLf & _
"Provider Version: " & .Properties("Provider Version") & vbCrLf

Debug.Print "ADO Version: " & .Version & vbCrLf & _
 "DBMS Name: " & .Properties("DBMS Name") & vbCrLf & _
 "DBMS Version: " & .Properties("DBMS Version") & vbCrLf & _
 "OLE DB Version: " & .Properties("OLE DB Version") & vbCrLf & _
 "Provider Name: " & .Properties("Provider Name") & vbCrLf & _
 "Provider Version: " & .Properties("Provider Version") & vbCrLf & _
 "Driver Name: " & .Properties("Driver Name") & vbCrLf & _
 "Driver Version: " & .Properties("Driver Version") & vbCrLf & _
 "Driver ODBC Version: " & .Properties("Driver ODBC Version")
End With
End Sub

-- 
Marty Connelly
Victoria, B.C.
Canada




More information about the AccessD mailing list