错误表现:
产生错误的场景如下:重新运行 Windows 7 Service Pack 1 (SP1) 或 Windows 2008 R2 sp-1 或具有 KB9823246 安装在计算机上编译 Microsoft ActiveX 数据对象 (ADO) 应用程序使用下列应用程序之一:
Microsoft Visual C++
Microsoft Visual Basic for Applications (VBA)
Microsoft Visual Basic 6
Microsoft.NET 应用程序
在这种情况下,您发现该应用程序不会在低级别的操作系统上运行。例如,它不会运行 Windows 7 的发行版、 Windows Vista 和其他 Windows 的早期版本。这取决于您的实现,您还收到类似于下列内容之一的错误消息。(您可能收到其他错误消息。)
错误消息 1
REGDB_E_CLASSNOTREG (0X80040154)
错误消息 2
E_POINTER (0X80004003)
错误消息 3
E_NOINTERFACE (0X80004002)
4 的错误消息
找不到 COM 对象强制转换的类型为接口类型 System.__ComObject ' ADODB。连接。此操作失败,因为对 COM 组件的接口 IID {00001550-0000-0010-8000-00AA006D2EA4} QueryInterface 调用失败,出现以下错误: 不支持此接口 (HRESULT 中的异常: 0x80004002 (E_NOINTERFACE))。"
下面的 Visual C++ 代码段复制此问题。
#import " msado15.dll" no_namespace rename("EOF","EndOfFile")
int main()
{
CoInitialize(NULL);
_ConnectionPtr pConnection = NULL;
HRESULT hr = pConnection.CreateInstance(__uuidof(Connection)); //hr gets E_NOINTERFACE here
}
下面的 Visual Basic for Applications 代码段复制此问题。
Private Sub Form_Load()
Dim Conn As New ADODB.Connection ‘Runtime error here: Class does not support Automation or does not support expected interface
End Sub
VBA 错误: 运行时错误"430": 类不支持自动化或不支持所需的接口
注意Microsoft 不再对 ADO 支持的主互操作程序集,并不再支持 Visual Basic 6。有关 Visual Basic 6 可支持性的详细信息,请访问下面的 MSDN 网页:
在 Windows Vista、 Windows Server 2008 和 Windows 7 的 Visual Basic 6.0 支持语句
ADO 支持性的主互操作程序集的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
318559有关 ADO (ADODB) Visual Studio.NET 中使用的主互操作程序集
原因:
因为有些 ADO 接口更改与新实例标识符 (Iid) 相关联的 Windows 7 SP1 中,将出现此问题。较旧的 IID 接口分配给以下后缀:
- 在 Windows 7 和更早版本的 Windows 中,_Connection IID 是 00000550-0000-0010-8000-00AA006D2EA4。
- 在 Windows 7 SP1 中,_Connection IID 00001550-0000-0010-8000-00AA006D2EA4,并且 _Connection_Deprecated IID 00000550-0000-0010-8000-00AA006D2EA4。
是与平台相关的一些 ADO Api 在 ADO 中 2.7 及更高版本。 在 64 位版本的 Windows,这些 ADO Api 使用 64 位数据类型 (如LONGLONG数据类型) 来处理参数。 但是,使用这些 Api 的应用程序仍使用长数据类型。 因此,当您尝试运行该宏时收到一条"类型不匹配"错误消息。
解决方案:
下载msado60_Backcompat_i386.tlb,将原来程序中的类似于下面的代码:
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")\
rename("LockTypeEnum","adoLockTypeEnum")\
rename("FieldAttributeEnum","adoFieldAtttributeEnum")\
rename("EditModeEnum","adoEditModeEnum")\
rename("RecordStatusEnum","adoRecordStatusEnum")\
rename("ParameterDirectionEnum","adoParameterDirectionEnum")\
rename("DataTypeEnum","adoDataTypeEnum")
替换成:
#import "msado60_Backcompat_i386.tlb" no_namespace rename("EOF","adoEOF")\
rename("LockTypeEnum","adoLockTypeEnum")\
rename("FieldAttributeEnum","adoFieldAtttributeEnum")\
rename("EditModeEnum","adoEditModeEnum")\
rename("RecordStatusEnum","adoRecordStatusEnum")\
rename("ParameterDirectionEnum","adoParameterDirectionEnum")\
rename("DataTypeEnum","adoDataTypeEnum")
重新编译成功即可!