DAO 3.6存在问题,因为它不支持行级锁定。有关详细信息,请参阅this Knowledge Base文章。
我从Access team's blog了解到:
在Office Access 2007中,新对象, 属性和方法将被添加 到DAO支持新功能 Access数据库引擎。
从Access2007 Visual Basic编辑器的对象浏览器中查看此库,新的化身称为ACEDAO。我可以在MSDN上的修补程序中找到acedao.dll,但没有别的。
有谁知道在哪里可以找到ACEDAO的最终用户文档?
如何发现ACEDAO是否支持行级锁定?
答案 0 :(得分:7)
我不相信该知识库文章有任何变化。但是,您必须记住如何实现记录锁定。
请记住,当网络上的任何用户打开任何表并且启用了行锁定时,DAO / ADO / ACE如何在代码中打开该表无关紧要。
任何具有行锁定功能的现有用户都会强制对他们正在使用的记录进行行锁定。而且,由于记录集代码很少会在任何合理的时间内保持打开/锁定记录,因此页面锁定或行锁定很少会在这里产生影响。因此,在大多数情况下,当用户在表单中编辑数据时需要锁定。在代码的情况下,它往往是一个罕见的问题。
因此,tools->选项中的用户设置确实为用户确定了这一选择。为了在这里真正清楚而不是分裂,UI的行锁定设置并没有真正覆盖选择,就像默认情况下它强迫问题一样。
记住打开该功能时行锁定的工作方式,是喷气引擎只是将记录的大小扩展到一个页面的大小,因此只使用像之前一样的普通旧式页面锁定。这就是我强迫这个问题的意思。如果用户已经打开行锁定,它就不会使bean的山丘变得不同,然后你尝试抓住一个用户锁定的记录,该记录集没有用行锁定打开reocrdsset(而不是页面锁定) )。您不能被锁定和编辑记录,因为这再次归结为页面分辨率。
没有真正的行锁定。但是,如果您将记录的大小扩展为总是一页,那么您将以迂回的方式实现相同的目标。
鉴于上述信息,这意味着两件事:
首先,如果用户已经使用表单锁定了记录,则将reocdset作为页面或行打开将不会有任何区别。用户编辑数据将决定页面将耗尽多少(如果打开行锁定,则它是整页数据)。
第二期。您想要长时间地考虑使用此选项,因为它会导致文件膨胀非常快,因为编辑的每个记录都将被强制占用一个数据库页面。如果您正在运行更新数千条记录的代码,那么您可能不想这样做。然而,用户无法在一天内真正编辑那么多记录,并且通过每日压缩例程,它再次成为问题。
逻辑上,这意味着该选项实际上仅对用户在相互绊倒时编辑数据有用。但是对于记录集代码,它很少会帮助甚至适合使用行锁定。
在一天结束时,如果您有多个用户试图以相同的形式获取相同的数据,那么该功能才真正适用。因此,这更像是使用代码+ reocordsets的用户界面功能。
您可能会发现ACE + dao可以打开带有行锁定的reocrdset,但为什么要担心?你不要使用dao,反正你也不喜欢它。并且,它无论如何都不会改变您的用户场景。
- 编辑:
我没有方便解释此记录页锁定的链接。我知道我在某个地方看过这个,但我没有链接。
过去几天我一直很忙(我是2010年测试版的一部分,周一还有向注册的公众发布的CTP)。所以,我最近很忙。
但是,您可以尝试一些显示此功能的代码。以下代码导致mdb中大约1 meg的膨胀,并且没有锁定行锁定。 (它从5.8兆到大约6.5)。
Dim rst As DAO.Recordset
Dim i As Long
Dim t As Single
Set rst = CurrentDb.OpenRecordset("contacts")
t = Timer
Me.Text1 = "working..."
DoEvents
Do While rst.EOF = False
rst.Edit
i = i + 1
rst!City = "ci " & i
rst.Update
rst.MoveNext
If i Mod 500 = 0 Then
Me.Text1 = i
DoEvents
End If
Loop
t = Timer - t
Me.Text1 = "done in " & t & " seconds"
Beep
如果运行带有记录锁定的SAME代码,则该文件的大小将达到123兆。这里是一个示例mdb的链接,其中包含上面的代码
http://www.kallal.ca/test/bloat.zip
所以,请在上面下载。使用tools-> options-> advanced->运行它打开行级锁定。
然后,清空表格。紧凑和维修。更改上述设置并再次运行(确保退出,然后在更改该设置后重新进入数据库)。
如果你在没有行锁定的情况下运行,文件增加大约一兆。如果在行锁定的情况下运行它,则会增加超过110兆的数据文件。这确实是一个非常大的差异。
答案 1 :(得分:0)
ACEDAO至少且极有可能DAO默认使用记录级锁定,无论MS文档如何。这可以通过使用相同的DAO代码从基础Access 97 DB切换到Access 2000或ACCDB后发生的膨胀(如上所述)来证明。
有关详细信息,请参阅我的回答:
Is it better to use ADO or DAO in Access 2007?
编辑以反映包含正确信息的MSDN链接:
“记录级锁定是ADO和DAO Recordset对象的默认值。页面级锁定是使用ADO Command对象或DAO的SQL DML语句(批量操作,如UPDATE,DELETE和INSERT INTO语句)的默认值QueryDef对象。“
http://msdn.microsoft.com/en-us/library/aa165435(office.10).aspx