存储在 SharePoint 库中的 Access DB 的并发和连接问题
Concurrency and connection issues to Access DB stored in SharePoint Library
简短版:(找出答案后)
我有一个 Excel VBA 应用程序,在 SharePoint 库上有一个 MS Access 数据库 (.accdb)。
检查的行为(显然记录在案 - 请参阅答案):
- 执行 ADODB 打开和关闭方法需要很长时间(~15 秒)。
- 如果多个用户同时连接到数据库,则仅保存关闭数据库连接的用户所做的更改LAST。更改游标类型、游标位置或锁定类型没有帮助。没有显示错误。
为什么会这样?
原题:
这里是第一个问题。希望这不会太罗嗦:
我已经构建了一个 Excel 应用程序,使用 VBA 与 MS Access 数据库 (.accdb) 通信,该数据库应该支持并发用户访问它。它旨在作为可访问文件放置在 Sharepoint 站点上(不以任何其他方式集成到其中)。当我在我的家庭网络上测试 Excel 文件和数据库时,它的工作就像一个魅力,事务和所有。但是,一旦我将它迁移到 Sharepoint,我就注意到它在我的个人网络上的运行方式存在一些极端差异:
ADODB {.open} 和 {.close} 方法每个至少需要 15 秒(使 Excel 冻结直到完成)。因此,我决定在应用程序的整个生命周期中只打开和关闭连接一次,并在连接断开时恢复连接。我知道强烈不推荐这样做,但不能让我的用户等待这么久。据我所知,这并没有造成任何问题,也许除了我将要解释的问题之外。
问题:除非关闭与数据库的所有活动用户连接,否则更改不会保存到实际数据库中,即使唯一活动的是连接。尝试更新时,每个用户的一切都没有错误地通过,并且每个用户都可以访问 his/her 更改,我想直到所有连接都终止。我尝试了所有可能的游标类型和锁类型,似乎没有任何效果。就好像数据库的本地副本存储在用户的计算机上(因此打开和关闭连接时需要等待很长时间),更新存储在临时版本上,而不是实际版本上。
我尝试了游标类型、游标位置、锁类型等所有可能的组合(一路上发现我的情况不支持动态游标 - 我想知道这是否就是答案)。
因此我别无选择,只能让该程序一次只能由一个用户访问,否则更改似乎会在此过程中丢失,从而使该程序非常不可靠。
我读到一些关于必须 "flush the buffer" 或 "refresh the cursor" 的内容。这甚至是possible/necessary?还是个案?如果我使用键集光标,我编辑的记录不应该显示给所有其他用户吗? (不是说新的)
为了它的价值,我在访问它之前将路径映射到共享点文件夹。
你们有没有遇到过这样的事情?或者有什么建议?
如果您需要我的代码示例,我会post 尽快提供。非常感谢!
我找到了问题的解决方案:
Although you can save an Access database file to OneDrive or a SharePoint document library, we recommend that you avoid opening an Access database from these locations. The file may be downloaded locally for editing and then uploaded again once you save your changes to SharePoint. If more than one person opens the Access database from SharePoint, multiple copies of the database may get created and some unexpected behaviors may occur. This recommendation applies to all types of Access files including a single database, a split database, and the .accdb, .accdc, .accde, and .accdr file formats. For more information on deploying Access, see Deploy an Access application.
简短版:(找出答案后)
我有一个 Excel VBA 应用程序,在 SharePoint 库上有一个 MS Access 数据库 (.accdb)。 检查的行为(显然记录在案 - 请参阅答案):
- 执行 ADODB 打开和关闭方法需要很长时间(~15 秒)。
- 如果多个用户同时连接到数据库,则仅保存关闭数据库连接的用户所做的更改LAST。更改游标类型、游标位置或锁定类型没有帮助。没有显示错误。
为什么会这样?
原题:
这里是第一个问题。希望这不会太罗嗦:
我已经构建了一个 Excel 应用程序,使用 VBA 与 MS Access 数据库 (.accdb) 通信,该数据库应该支持并发用户访问它。它旨在作为可访问文件放置在 Sharepoint 站点上(不以任何其他方式集成到其中)。当我在我的家庭网络上测试 Excel 文件和数据库时,它的工作就像一个魅力,事务和所有。但是,一旦我将它迁移到 Sharepoint,我就注意到它在我的个人网络上的运行方式存在一些极端差异:
ADODB {.open} 和 {.close} 方法每个至少需要 15 秒(使 Excel 冻结直到完成)。因此,我决定在应用程序的整个生命周期中只打开和关闭连接一次,并在连接断开时恢复连接。我知道强烈不推荐这样做,但不能让我的用户等待这么久。据我所知,这并没有造成任何问题,也许除了我将要解释的问题之外。
问题:除非关闭与数据库的所有活动用户连接,否则更改不会保存到实际数据库中,即使唯一活动的是连接。尝试更新时,每个用户的一切都没有错误地通过,并且每个用户都可以访问 his/her 更改,我想直到所有连接都终止。我尝试了所有可能的游标类型和锁类型,似乎没有任何效果。就好像数据库的本地副本存储在用户的计算机上(因此打开和关闭连接时需要等待很长时间),更新存储在临时版本上,而不是实际版本上。
我尝试了游标类型、游标位置、锁类型等所有可能的组合(一路上发现我的情况不支持动态游标 - 我想知道这是否就是答案)。
因此我别无选择,只能让该程序一次只能由一个用户访问,否则更改似乎会在此过程中丢失,从而使该程序非常不可靠。
我读到一些关于必须 "flush the buffer" 或 "refresh the cursor" 的内容。这甚至是possible/necessary?还是个案?如果我使用键集光标,我编辑的记录不应该显示给所有其他用户吗? (不是说新的)
为了它的价值,我在访问它之前将路径映射到共享点文件夹。
你们有没有遇到过这样的事情?或者有什么建议?
如果您需要我的代码示例,我会post 尽快提供。非常感谢!
我找到了问题的解决方案:
Although you can save an Access database file to OneDrive or a SharePoint document library, we recommend that you avoid opening an Access database from these locations. The file may be downloaded locally for editing and then uploaded again once you save your changes to SharePoint. If more than one person opens the Access database from SharePoint, multiple copies of the database may get created and some unexpected behaviors may occur. This recommendation applies to all types of Access files including a single database, a split database, and the .accdb, .accdc, .accde, and .accdr file formats. For more information on deploying Access, see Deploy an Access application.