Access 2010:链接数据库,引用还是加载项?

时间:2017-09-05 17:51:41

标签: ms-access ms-access-2010

环顾四周,找到了各种答案,但没有最近真正比较这些选项的优点和缺点。所以我想我会要求社区权衡你喜欢哪条路线以及为什么。

背景

这就是我们所拥有的:

  • 一套通用的Access模块​​&许多协议数据库中使用的类(Access 2010 * .accdb拆分前/后端)
  • 前端链接到后端数据库表&代码(链接的dbs)
  • 后端包含协议特定数据&代码
  • 用户不应直接编辑公共模块/类数据库

的已知,

插件&数据库参考数据库:

  • 每次更改时都需要重新分发(即使其中没​​有更改代码)。
  • 必须在IDE中与协议数据库的IDE进行编辑(否则您将丢失编辑,因为该数据库不是常用代码)

问题

如何将公共模块/类数据库连接到协议数据库?

  • 链接数据库就像后端一样
  • 将其作为参考附加在IDE(工具>参考)
  • 创建加载项并将其添加为参考

你会怎么做?为什么?

有哪些优点/缺点?

哪个选项可以最大限度地提高性能?

2 个答案:

答案 0 :(得分:0)

我有以下代码的几种变体,我认为这个最适用于您的情况(它从数据库中提取模块和表单,一旦数据库启动就覆盖现有代码)。

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 enum对应的查找字段(一些不相关)删除了对象)。

<强>优点:

  • 您将获得数据库中所有模块的全新副本,确保任何覆盖都无关紧要。
  • 您可以向Objects表中添加第三列以过滤掉特定数据库的对象,从而有选择地将某些对象推送到某些前端,将其他对象推送到其他对象(以及第4列指定名称)在ModulesDb文件中的对象,为不同的前端使用相同形式的多个变体。
  • 您在前端拥有所有代码,因此外部文件和引用没有任何奇怪之处
  • 您还可以使用此代码来提取您想要的任何其他类型的对象(在我的情况下主要是查询和表单)

<强>缺点:

  • 加载时间增加(通常一点点,但取决于导入的对象数量,可能很长)
  • 模块对最终用户可见且可读(技术上也可修改,但在数据库加载时撤消任何更改)
  • 您无法通过这种方式修改导入的模块
  • 您需要适当的安全设置,否则用户将在每个打开的数据库上收到带有安全弹出窗口的垃圾邮件

我还有一个变体,它在打开时异步地将模块从一个单独的线程推送到数据库,我有另一个实现,允许我在修改后有选择地将模块移动到前端。

如果需要,我可以分享它们,但尚未在生产环境中实现异步(仍在进行中,它应该节省加载时间并且可以推送所有模块)

答案 1 :(得分:0)

首先是一个大&#34;谢谢你&#34;到@Erik@Gustav输入。

<强>解决方案

在我的用例中选择的解决方案是使用包含模块和类的公共参考库数据库。

虽然我考虑了@Erik's解决方案,但最后将模块和类复制到每个协议数据库中有点像发送它们的副本,然后可以从主模块/类中转移。这部分是转向单一参考数据库的一个原因 - 避免传播到其他数据库,因此会有一个代码源。

警告: 如果参考库解决方案存在性能问题,那么类和&amp;可能必须从公共库数据库ala @Erik's解决方案中提取模块。

数据库作为参考资料库

公共模块和类包含在数据库(* .accdb)中。只要在另一个数据库中需要代码,就会添加引用,例如引用任何其他代码库(VB IDE - Tools > References)。唯一的区别是您Browse...到库中并确保在搜索过滤器中选择Microsoft Access Databases (*.accdb)

如果参考库数据库保存在一个公共位置,那么重新引用就不会有问题,尽管重新连接引用很容易(与首先连接相同)。

我还将通用版本控制和开发模块分离为类似的单独数据库,这些数据库可以在开发期间在需要时引用,在给定数据库投入生产时可以取消引用。

开发&#34;陷阱&#34;

实际上,这些是需要记住的更多考虑/事项而不是真实的&#34;陷阱&#34;:

- Edit library classes & modules in the library database

如果您从引用库数据库的数据库编辑类或模块,则一旦关闭正在使用的数据库,就会丢失编辑内容。

可以尝试从您正在使用的数据库进行编辑 - 代码运行,但它不会保存< / em>的

我经常打开Notepad ++或OneNote来复制&amp;粘贴代码我测试库数据库。这样我就可以继续处理其他领域并进行一系列更改来更新库数据库。

- Compile the library database before using its components in the referencing database

这更像是一个工作流程问题 - 请务必保存&amp;在库数据库中编译,然后在完成更改后打开引用数据库并首先关闭库数据库。

<强>资源

以下是一些有用的链接:

第6个参考(仅通过互联网档案可用)在梳理如何正确实例化类时特别有用。最后,我选择创建一个具有多个函数的Factory类(静态类)(每个类一个 - 例如NewClassABC()),它在公共引用库数据库中实例化该类。

到目前为止,这么好。

参考库数据库将代码放在一个位置,并且在需要时可以将其他协议数据库更新到其中。不处理同一模块或类的多个副本和版本。

希望这有助于其他人寻找共同的&#34;库类型解决方案。