Sql 超过文件共享锁定计数,运行时错误3052

Sql 超过文件共享锁定计数,运行时错误3052,sql,ms-access,vba,Sql,Ms Access,Vba,好的,我有一个宏,它进入并检查表,以确定由用户设置的应用程序的格式。如果此格式设置为欧洲格式,则它将运行一个函数,该函数将遍历一个表,并将日期格式从MM/dd/yyyy切换到dd/MM/yyyy。一切似乎都设置正确,当在美国设置宏格式时,宏运行正确(如果格式未设置为欧式,则应考虑跳过这一行)。但是,每当格式设置为欧式时,我会弹出以下运行时错误: Run-Time error '3052': File sharing lock count exceeded. Increase MaxLoc

好的,我有一个宏,它进入并检查表,以确定由用户设置的应用程序的格式。如果此格式设置为欧洲格式,则它将运行一个函数,该函数将遍历一个表,并将日期格式从MM/dd/yyyy切换到dd/MM/yyyy。一切似乎都设置正确,当在美国设置宏格式时,宏运行正确(如果格式未设置为欧式,则应考虑跳过这一行)。但是,每当格式设置为欧式时,我会弹出以下运行时错误:

    Run-Time error '3052':
File sharing lock count exceeded. Increase MaxLocksPerFile registry entry.
现在,每当我遇到一个错误,指出修复方法是修改注册表中的某些内容时,我总是很小心。更不用说,我不希望客户机只是为了让应用程序正常工作而这样做。然而,我尝试了一下,只是想看看这是否真的可以通过以下步骤解决问题。虽然当我将默认的MaxLocksPerFile从其默认值(9500)修改为(30000)并再次运行宏时,我仍然得到了相同的错误,但计数稍微大一点

在我运行了大约12000行之后得到错误之前,在更改之后会出现大约150000行

这让我相信,在修改每一行之后,我都错误地关闭了更新

下面是我的代码:

    Public Function UKDateFormat() As Variant
Dim varPieces As Variant
Dim strNew As String
Dim varReturn As Variant
Dim Strsql As String
Dim db As dao.Database
Dim rstAlarmdetDateMod As dao.Recordset
Dim i As Long

Set db = CurrentDb()

Strsql = "select AlarmDate From AlarmdetDateMods;"
Set rstAlarmdetDateMod = db.OpenRecordset(Strsql, dbOpenDynaset)

If (rstAlarmdetDateMod.RecordCount > 0) Then
    rstAlarmdetDateMod.MoveFirst

i = 0


    While (rstAlarmdetDateMod.EOF) = False
    i = i + 1
       rstAlarmdetDateMod.Edit
       rstAlarmdetDateMod![alarmdate] = CDate(Format(rstAlarmdetDateMod![alarmdate], "dd/MM/yyyy"))
       rstAlarmdetDateMod.Update
       rstAlarmdetDateMod.MoveNext
    Wend
End If
rstAlarmdetDateMod.Close
db.Close


End Function
这是我的更新查询:

UPDATE DISTINCTROW AlarmdetDateMods SET AlarmdetDateMods.AlarmDate = CDate(Format([AlarmDate],"dd/mm/yyyy"));
我想知道的是:我的函数到底做错了什么,导致了这个错误,我如何纠正它,使我不必进入和修改注册表来让这个函数工作

非常感谢您的帮助或建议。
谢谢。

除了您的UKDateFormat函数外,您还向我们展示了此更新语句

UPDATE DISTINCTROW AlarmdetDateMods
SET AlarmdetDateMods.AlarmDate = CDate(Format([AlarmDate],"dd/mm/yyyy"));
然而,目前还不清楚这到底是怎么回事。它有用吗?它是否与UKDateFormat函数的错误相同而失败?另一个错误

尝试修改UPDATE语句。我认为DISTINCTROW在这种情况下没有用处;建议你扔掉它

此外,您的更新似乎依赖于隐式数据类型转换。AlarmDate是一个文本值。将该文本传递给Format()函数,将其视为日期/时间值,并将其转换为不同格式的字符串。然后要求CDate()将该字符串值转换为日期/时间值。最后,日期/时间值存储回AlarmDate文本字段

在将格式化字符串存储到文本字段之前,我至少可以避免将其转换回日期/时间值。但是,我也会使数据类型转换显式而不是隐式。并将更新尝试限制为仅AlarmDate包含有效日期/时间值文本表示形式的行

UPDATE AlarmdetDateMods
SET AlarmDate = Format(CDate(AlarmDate),"dd/mm/yyyy")
WHERE IsDate(AlarmDate) = True;

注意:此建议假设更改所有存储的AlarmDate文本值是合理的。我对此表示怀疑。似乎AlarmDate应该是日期/时间而不是文本。如果在显示这些日期/时间值时需要更改格式,请使用窗体上绑定控件的format属性或查询中的format()函数进行更改。

除了UKDateFormat函数外,您还向我们展示了此UPDATE语句

UPDATE DISTINCTROW AlarmdetDateMods
SET AlarmdetDateMods.AlarmDate = CDate(Format([AlarmDate],"dd/mm/yyyy"));
然而,目前还不清楚这到底是怎么回事。它有用吗?它是否与UKDateFormat函数的错误相同而失败?另一个错误

尝试修改UPDATE语句。我认为DISTINCTROW在这种情况下没有用处;建议你扔掉它

此外,您的更新似乎依赖于隐式数据类型转换。AlarmDate是一个文本值。将该文本传递给Format()函数,将其视为日期/时间值,并将其转换为不同格式的字符串。然后要求CDate()将该字符串值转换为日期/时间值。最后,日期/时间值存储回AlarmDate文本字段

在将格式化字符串存储到文本字段之前,我至少可以避免将其转换回日期/时间值。但是,我也会使数据类型转换显式而不是隐式。并将更新尝试限制为仅AlarmDate包含有效日期/时间值文本表示形式的行

UPDATE AlarmdetDateMods
SET AlarmDate = Format(CDate(AlarmDate),"dd/mm/yyyy")
WHERE IsDate(AlarmDate) = True;

注意:此建议假设更改所有存储的AlarmDate文本值是合理的。我对此表示怀疑。似乎AlarmDate应该是日期/时间而不是文本。如果在显示这些日期/时间值时需要更改格式,请使用窗体上绑定控件的format属性或查询中的format()函数进行更改。

是AlarmDate字段日期/时间或文本的数据类型?它是文本,我是否应将其更改为日期/时间?我想这取决于您如何使用它。日期/时间值实际上是数字数据类型。。。无论出于显示目的如何格式化,存储值都是相同的。我的直觉是对日期/时间值使用日期/时间类型,因为这使日期操作更加方便。通过在窗体上设置绑定数据控件的format属性,或在查询中使用format()函数,可以为显示目的格式化这些值。您更改表中存储的每个AlarmDate字符串的方法吓到了我!您建议如何操作?如果FROM子句中没有JOIN,DISTINCTROW没有任何用途(与SELECT本身相反)。AlarmDate字段的数据类型是日期/时间还是文本?它是文本,我是否应该将其更改为日期/时间?我想这取决于您如何使用它。日期/时间值实际上是数字数据类型。。。无论出于显示目的如何格式化,存储值都是相同的。我的直觉是对日期/时间值使用日期/时间类型,因为这使日期操作更加方便。通过在窗体上设置绑定数据控件的format属性,或在查询中使用format()函数,可以为显示目的格式化这些值。更改每个存储的报警日期的方法