您想知道有谁正在使用您的 Access 文件吗?(多人环境中)

来源: 作者: 2007-11-14 出处:pcdog.com

access  安全  

  如果您使用 Access 建立了一個多人使用的資料庫環境,有時候您必須要知道有誰正在使用程式連進這個共享的資料庫,但是您又不想因為如此而要建立一套完整的 Access 安全系統,您有二個選擇:

第一個: 您可以在資料庫中建立一個 "Login Table",每次使用者進入或離開系統時就 Update 這個 Table.

第二個: 較好一點,您可以使用 msldbusr.dll,它可以告訴您目前正連進資料庫的電腦名稱 (Computer Name),這些資料其實是存放在副檔名為 LDB 的檔案中。一旦您從 DLL 中抓到這些資料,您便可以送出訊息,通知 Client 端的使用者 (Remote User) 結束應用程式,以中斷和資料庫的連結,然後您便可以使用 Exclusive Mode 來維護資料庫了。

在這裡,我們要說明的是第二種方法,也就是使用 msldbusr.dll。它提供了二個 Function,說明如下:

1、LDBUser_GetUsers:呼叫後會傳回二部份,一個是使用者陣列,一個是連結到資料庫的使用者數。

Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() _

As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer

lpszUserBuffer():傳回使用者陣列,注意!必須使用 ReDim 宣告成變動陣列!

lpszFilename:資料庫名稱 ( .mdb 完整路徑 ),若 .ldb 檔不存在,會傳回錯誤代碼。

nOptions:下參數宣告資料回傳的型態。可以使用的參數有四個,如下:

1=傳回自從 .ldb 產生後,所有曾經使用資料庫的使用者機器名稱 (Computer Name) 及數目。

2=只傳回目前正在使用資料庫的使用者機器名稱 (Computer Name) 及數目。

4=只傳回導致目前資料庫損毀的使用者機器名稱 (Computer Name)。

8=只傳回使用者的總數,但是並不傳回使用者陣列。

2、LDBUser_GetError:呼叫 LDBUser_GetUsers 若有錯誤產生,可根據傳回的錯誤代碼找到說明。

Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo As Long) As String

nErrorNo:呼叫 LDBUser_GetUsers 產生錯誤所傳回的代碼,介於 -1 至 -14 之間。說明如下:

-1 = Can't open the LDB file. ( 無法開啟 LDB 檔案 )

-2 = No user connected. ( 沒有使用者在使用資料庫 )

-3 = Can't create an array. ( 無法建立陣列 )

-4 = Can't redimension array. ( 無法重新建立陣列 )

-5 = Invalid argument passed. ( 傳入無效的參數 )

-6 = Memory allocation error. ( 記憶体配置錯誤 )

-7 = Bad index. ( 無效的索引 )

-8 = Out of memory. ( 記憶体不足 )

-9 = Invalid argument. ( 無效的參數 )

-10= LDB is suspected as corrupted. ( LDB 檔案可能損毀 )

-11= Invalid argument. ( 無效的參數 )

-12= Unable to read MDB file. ( 無法讀取 MDB 檔案 )

-13= Can't open the MDB file. ( 無法開啟 MDB 檔案 )

-14= Can't find the LDB file. ( 找不到 LDB 檔案 )

'範例程式:( 移除所有的 Form,請將以下程式複製到 .bas 檔案中即可執行 )

Option Explicit

Declare Function LDBUser_GetUsers Lib "MSLDBUSR.DLL" (lpszUserBuffer() _

As String, ByVal lpszFilename As String, ByVal nOptions As Long) As Integer

Declare Function LDBUser_GetError Lib "MSLDBUSR.DLL" (ByVal nErrorNo As Long) As String

Sub MAIN()

Dim psMDBFilename As String

psMDBFilename = InputBox("請輸入資料庫名稱:")

If Len(psMDBFilename) Then

ShowUsers psMDBFilename

End If

End Sub

Sub ShowUsers(psFilename As String)

ReDim lpszUserBuffer(1) As String

Dim psError As String

Dim cUsers As Long

Dim iLoop As Long

'呼叫 LDBUser_GetUsers 傳回使用者陣列

cUsers = LDBUser_GetUsers(lpszUserBuffer(), psFilename, 1)

'確認是否傳回使用者陣列

If (cUsers = 0) Then

Debug.Print "No Users."

GoTo Exit_ShowUsers

End If

'若有錯誤則顯示錯誤訊息

If (cUsers < 0) Then

psError = LDBUser_GetError(cUsers)

Debug.Print "Error #:"; cUsers; "--"; psError

GoTo Exit_ShowUsers

End If

'顯示使用者陣列

For iLoop = 1 To cUsers

Debug.Print "User "; iLoop; ":"; lpszUserBuffer(iLoop)

Next iLoop

Exit_ShowUsers:

End Sub
更多内容请看PCdog.com--专家答疑专题

上一篇:利用VB使ACCESS数据库在网络使用中保持同步
下一篇:使用 ADO 來压缩或修复 Microsoft Access 文件