环顾四周,找到了各种答案,但没有最近真正比较这些选项的优点和缺点。所以我想我会要求社区权衡你喜欢哪条路线以及为什么。
背景
这就是我们所拥有的:
的已知,
插件&数据库参考数据库:
问题
如何将公共模块/类数据库连接到协议数据库?
你会怎么做?为什么?
有哪些优点/缺点?
哪个选项可以最大限度地提高性能?
答案 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对应的查找字段(一些不相关)删除了对象)。
<强>优点:强>
<强>缺点:强>
我还有一个变体,它在打开时异步地将模块从一个单独的线程推送到数据库,我有另一个实现,允许我在修改后有选择地将模块移动到前端。
如果需要,我可以分享它们,但尚未在生产环境中实现异步(仍在进行中,它应该节省加载时间并且可以推送所有模块)
答案 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;库类型解决方案。