环顾四周,找到了各种各样的答案,但一无所获recent这确实比较了这些选项的优点和缺点。因此,我想请社区权衡一下您更喜欢哪条路线以及原因。
背景
这就是我们所拥有的:
- 众多协议数据库中使用的一组通用 Access 模块和类(Access 2010 *.accdb 分割前端/后端)
- 前端链接到后端数据库表和代码(链接数据库)
- 后端包含协议特定的数据和代码
- 公共模块/类数据库不应由用户直接编辑
Knowns
插件和数据库参考数据库:
- 每次更改时都需要重新分发(即使其中没有更改代码)。
- 必须在其 IDE 与协议数据库的 IDE 中进行编辑(否则您将丢失编辑内容,因为该数据库不是通用代码的)
问题
公共模块/类数据库应该如何连接到协议数据库?
- 就像后端一样链接数据库
- 将其作为参考附加到 IDE 中(“工具”>“参考”)
- 创建加载项并将其添加为参考
你会怎么做以及为什么?
有什么优点/缺点?
哪个选项可以最大限度地提高性能?
我有以下代码的几种变体,我认为这个最适合您的情况(它从数据库中提取模块和表单,一旦数据库启动就覆盖现有的模块和表单)。
Public Sub ImportModules()
Dim ImportDbLocation As String: ImportDbLocation = CurrentProject.path & "\ModuleDb.accdb"
Dim ObjectsToImport As Recordset
Set ObjectsToImport = CurrentDb.OpenRecordset("SELECT * FROM Objects IN """ & ImportDbLocation & """")
Do While Not ObjectsToImport.EOF
On Error Resume Next
DoCmd.DeleteObject ObjectsToImport!ObjectType, ObjectsToImport!ObjectName
On Error GoTo 0
DoCmd.TransferDatabase acImport, "Microsoft Access", ImportDbLocation, ObjectsToImport!ObjectType, ObjectsToImport!ObjectName, ObjectsToImport!ObjectName
ObjectsToImport.MoveNext
Loop
End Sub
该代码由前端数据库中的 AutoExec 宏触发。
该数据库称为ImportDbLocation
是包含我要导入的所有模块和表单的数据库。它包含一个名为Objects
。该表有两列,其中一列名为ObjectName
包含应拉取的所有对象的名称,其中一个名为ObjectType
,这是一个对应于的查找字段acObjectType 枚举 https://msdn.microsoft.com/en-us/vba/access-vba/articles/acobjecttype-enumeration-access(删除了一些不相关的对象)。
优点:
- 您将获得数据库中所有模块的全新副本,确保任何覆盖都无关紧要。
- 您可以向“对象”表添加第三列,以筛选出特定数据库的对象,从而有选择地将某些对象推送到某些前端,将其他对象推送到其他前端(第四列用于指定 ModulesDb 文件中的对象名称) ,为不同的前端使用相同形式的多个变体)。
- 所有代码都在前端,因此外部文件和引用并不奇怪
- 您还可以使用此代码来提取您想要的任何其他类型的对象(在我的例子中主要是查询和表单)
缺点:
- 加载时间增加(通常会增加一点点,但取决于导入的对象数量,可能会很长)
- 模块对最终用户可见且可读(技术上也可以修改,但任何更改都会在数据库加载时撤消)
- 您无法修改以这种方式进行导入的模块
- 您需要适当的安全设置,否则用户将在每个打开的数据库上收到安全弹出窗口的垃圾邮件
我还有一个变体,它在打开时将模块从单独的线程异步推送到数据库,并且我有另一个实现,允许我在进行修改后有选择地将模块移动到前端。
如果需要,我可以共享它们,但尚未在生产环境中实现异步(仍在进行中,它应该节省加载时间并可以推送所有模块)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)