[英]Multiple user writing to a single log text file
我試圖在任何用戶進行任何操作(例如登錄,編輯等)時,在MS Access 2016中的應用程序中使用日志系統。
到目前為止,我編寫的代碼使用open語句相當簡單,
Public Sub WriteLog(ByVal strContent As String)
fileLog = FreeFile
Open "D:/log.txt" For Output As fileLog
Print #fileLog, strContent
Close #fileLog
End Sub
這不好,因為我打算在共享網絡中寫日志文件,這意味着許多用戶可能會同時打開要寫入的文件。 這肯定會引發錯誤。 我想做一些排隊寫入文件但沒有找到任何解決方案。 這樣做是不是不可能嗎?
編輯:
在文件關閉后遞歸檢查文件是否打開並寫入文件,這是一種以某種方式“排隊”寫入文件的方法。 也許需要添加一些代碼來確保遞歸執行此函數的限制。
Function AvailableToWrite()
' Test to see if the file is open.
If IsFileOpen("D:\log.txt") Then
AvailableToWrite = IsFileOpen() ' Recursively check until file is closed
Else
AvailableToWrite = True
End If
End Function
Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer
On Error Resume Next
filenum = FreeFile()
' Attempt to open the file and lock it.
Open filename For Input Write As #filenum
Close filenum
errnum = Err ' Save the error number that occurred.
On Error GoTo 0 ' Turn error checking back on.
' Check to see which error occurred.
Select Case errnum
' No error occurred.
' File is NOT already open by another user.
Case 0
IsFileOpen = False
' Error number for "Permission Denied."
' File is already opened by another user.
Case 70
IsFileOpen = True
End Select
End Function
通常,在文本文件中寫一行只需要一瞬間。
因此,您可以簡單地在循環中捕獲錯誤,如果您的函數無法寫入文件,等待一小段隨機長度,然后重試直到成功。
附錄
在新嘗試完成之前塊的情況下的可變延遲的方法:
' Function to run a sequence of updates at random intervals for a preset
' duration while handling any concurrency issue that may arise.
' Run the function concurrently in two or more instances of Microsoft Access.
'
' Output logs the updates and lists the errors encountered when an update
' collides with an ongoing update from (one of) the other instance(s).
'
' 2016-01-31. Gustav Brock, Cactus Data ApS, CPH.
'
Public Sub ConcurrencyAwareTest()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim fd As DAO.Field
Dim StopTime As Single
Dim Delay As Single
Dim Attempts As Long
Dim LoopStart As Single
Dim LoopEnd As Single
Dim Loops As Long
Dim SQL As String
Dim Criteria As String
Dim NewValue As Boolean
SQL = "Select * From " & TableName & ""
Criteria = KeyName & " = " & CStr(KeyValue) & ""
Set db = CurrentDb
Set rs = db.OpenRecordset(SQL, dbOpenDynaset, dbSeeChanges)
rs.FindFirst Criteria
Set fd = rs.Fields(FieldName)
' Set time for the test to stop.
StopTime = Timer + Duration
' Let SetEdit and GetUpdate print debug information.
DebugMode = True
' At random intervals, call updates of the field until StopTime is reached.
While Timer < StopTime
' Postpone the next update.
Delay = Timer + Rnd / 100
While Timer < Delay
DoEvents
Wend
Loops = Loops + 1
LoopStart = Timer
Debug.Print Loops, LoopStart
' Perform update.
NewValue = Not fd.Value
Do
' Count the attempts to update in this loop.
Attempts = Attempts + 1
' Attempt edit and update until success.
SetEdit rs
fd.Value = NewValue
Loop Until GetUpdate(rs)
LoopEnd = Timer
' Print loop duration in milliseconds and edit attempts.
Debug.Print , LoopEnd, Int(1000 * (LoopEnd - LoopStart)), Attempts
Attempts = 0
Wend
rs.Close
DebugMode = False
Set fd = Nothing
Set rs = Nothing
Set db = Nothing
End Sub
目的是證明這篇文章中描述的概念:
Sub WriteLog(Optional note As String)
'add event to log
DoCmd.SetWarnings False
DoCmd.RunSQL "INSERT INTO tblLog (logNote) SELECT """ & Replace(note,"""","'") & """"
DoCmd.SetWarnings True
'export to text file
On Error Resume Next 'ignore error
DoCmd.TransferText acExportDelim,,"tblLog","c:\LogFile.txt",True
On Error Goto 0 'back to normal error handling
Debug.Print "Wrote to log & updated text file."
End Sub
WriteLog "Your note here"
: 用當前日期/時間加上“你的筆記在這里”保存一條記錄
WriteLog
: 保存只有日期/時間的記錄
默認情況下它是逗號分隔的(因此可以在Excel中打開它),但是可以通過創建規范並使用acExportFixed
標志以“固定寬度”導出一些額外的步驟。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.