【问题标题】:File sharing lock count exceeded, runtime error 3052超出文件共享锁计数,运行时错误 3052
【发布时间】:2012-02-13 02:11:16
【问题描述】:

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

    Run-Time error '3052':
File sharing lock count exceeded. Increase MaxLocksPerFile registry entry.

现在,每当我收到指出修复是修改注册表中的某些内容的错误时,我总是很谨慎。更不用说这不是我希望客户为了让应用程序工作而做的事情。但是我试了一下,看看这是否真的可以通过遵循these 步骤来解决问题。尽管当我确实将默认 MaxLocksPerFile 从它的默认值(9500)修改为(30,000)并再次运行宏时,我仍然得到相同的错误,但计数稍大。

在运行大约 12,000 行后我会收到错误之前,更改后它会出现大约 15,0000 行。

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

下面是我的代码:

    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"));

我想知道的是:我的函数到底做错了什么,导致出现此错误,以及如何以某种方式纠正它,这样我就不必进入和修改注册表以使此功能正常工作?

非常感谢任何帮助或建议。 谢谢。

【问题讨论】:

  • 你的AlarmDate字段的数据类型是日期/时间还是文本?
  • 这是一个文本,我应该把它改成日期/时间吗?
  • 我想这取决于你如何使用它。日期/时间值实际上是一种数字数据类型......无论您出于显示目的如何格式化它,存储的值都是相同的。我的直觉是对日期/时间值使用日期/时间类型,因为这样更方便日期操作。通过在窗体上设置绑定数据控件的格式属性或在查询中使用 Format() 函数,可以对值进行格式化以用于显示目的。您更改表中每个存储的 AlarmDate 字符串的方法让我害怕!
  • 你会建议怎么做?
  • 在 FROM 子句中没有 JOIN,DISTINCTROW 没有任何用途(与 SELECT 本身相反)。

标签: sql ms-access vba


【解决方案1】:

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

UPDATE DISTINCTROW AlarmdetDateMods
SET AlarmdetDateMods.AlarmDate = CDate(Format([AlarmDate],"dd/mm/yyyy"));

但是,目前尚不清楚这是怎么回事。它有效吗?它是否因与 UKDateFormat 函数相同的错误而失败?另一个错误?

尝试修改后的 UPDATE 语句。我认为 DISTINCTROW 在这种情况下没有用;建议你丢弃它。

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

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

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

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

【讨论】:

  • 将 AlarmDate 从文本交换为日期/时间正是如此,多亏了我什至不再需要上面的代码或更新,因为似乎访问会自动格式化方法中的文本我希望它现在就在里面。谢谢!
  • 好!我认为这意味着用户的区域设置会自动驱动适当的日期/时间显示格式。当它可以简单地工作时最好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多