在访问数据库中,我有一个在启动时调用的小函数,它注册一个用于生成条形码的软件。
当没有安装软件时,那么Microsoft访问运行时错误,所以我想添加一些正确的错误处理,告知用户导致问题的原因。
此函数在启动时从宏调用,并且正在使数据库崩溃而不是错误处理正常工作。
我的错误处理不正确吗?
Public Function LicenseTBarCode()
On Error GoTo Err_LicenceTBarCode
Dim TB As New TBarCode10
TB.LicenseMe "<EXPUNGED>", eLicKindSite, 1, "<EXPUNGED>", eLicProd1D
Set TB = Nothing
Exit Function
Err_LicenceTBarCode:
MsgBox "TBarcode Software is not installed. Please contact the database administrator.", vbExclamation, Error
DoCmd.Quit
End Function
答案 0 :(得分:3)
更改代码以使用后期绑定:
Public Function LicenseTBarCode()
On Error GoTo Err_LicenceTBarCode
Dim TB
Set TB = CreateObject("TBarCode10.TBarCode10")
TB.LicenseMe "<EXPUNGED>", eLicKindSite, 1, "<EXPUNGED>", eLicProd1D
Set TB = Nothing
Exit Function
Err_LicenceTBarCode:
MsgBox "TBarcode Software is not installed. Please contact the database administrator.", vbExclamation, Error
DoCmd.Quit
End Function
为了使其正常工作,您确实需要对所有TBarCode代码使用后期绑定,包括您可能正在使用的任何其他TBarCode对象。如果您还不熟悉Late Binding,那么首先要理解它可能有点难度,特别是如果您正在使用任何使用工厂模式的类。
使用后期绑定,您将取消选中对DLL的引用,然后您的代码需要编译而不会出现错误。使用Late Binding进行开发可能具有挑战性,因为您无法访问IntelliSense。最好使用Early Binding进行开发,然后将代码转换为Late Binding。
使用Late Binding失去的另一件事是在原始对象中定义的任何常量。你必须自己创建这些。根据您需要使用的数量以及您需要使用它们的位置,创建模块以保存这些常量可能最简单。您实际上只需要拥有代码中实际使用的常量。
Global Const eLicKindSingle = 1 'Single license for exactly one computer
Global Const eLicKindSite = 2 'Site license for an arbitrary number of computers within one site (or one facility) at one legal address
Global Const eLicKindDeveloper = 3 'Developer license for redistribution to 3rd party
Global Const eLicKindWeb = 3 'Web-server license
Global Const eLicProd1D = 32 '(1D codes)
Global Const eLicProd2D = 33 '(2D codes)
或者,您可以使用常量包含的值。例如:
TB.LicenseMe "<EXPUNGED>", 2, 1, "<EXPUNGED>", 32
另外,据我所知Late Binding不适用于ActiveX控件。 ActiveX控件本质上是早期绑定的。
还有另一种方法可以解决这个问题。我使用“启动”数据库文件来处理主数据库的一些先决条件。此入门数据库不使用任何引用。它仅检查文件系统以查看是否安装了正确的文件。如果不是,它会弹出一个带有正确错误/警告的消息框,然后运行主数据库文件或选择不运行它,具体取决于您写入的逻辑。这是避免使用Late Binding的一种方法。