【发布时间】:2018-09-10 09:18:53
【问题描述】:
每当任何用户进行任何操作(例如登录、编辑等)时,我都会尝试让日志系统在 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
【问题讨论】:
-
啊!讽刺的是!您使用的是多用户数据库系统!将日志文件放在意味着供多个用户共享的 Access 表中,而不是蹩脚的文本文件!你甚至可以制作一个批处理文件或设置它,以便用户可以通过电子邮件或短信将他们的笔记发送到数据库(只需最少的工作!)事实上我有一个我经常使用的,我会给你代码,一分钟!
-
@ashleedawg 客户喜欢使用文本文件作为日志系统,这很痛苦。完全不可能?,我的客户就像应用程序的管理员,所以他们想要一个简单的日志文件来读取用户在做什么..
-
您仍然可以随时将其导出为文本。其实每次更新。但是这样就不会有冲突(即,2 个用户尝试同时更新,所以一个会丢失)。我会告诉你,你的文本文件仍然存在,片刻......
-
@ashleedawg 谢谢!非常感谢这一点。我做了一些阅读,并且在 vba ms 访问中,可以在写入文件时锁定文件,这是否与创建队列以写入该文件有关?
-
如果它被锁定,那么没有其他人可以写入它。 (因此一个事件可能会丢失,甚至可能使程序崩溃)...这样,表永远不会被锁定。因此,如果我打开了表格,并且您添加了它,我将看不到更新,但下次我关闭并重新打开时,我会看到当前版本(不会丢失任何内容)......实际上在技术上这种情况下,可以根据需要删除 TXT 文件,下次记录事件时它只会创建一个新文件(包含完整数据)。
标签: vba file ms-access logging queue