2012-03-16 70 views
3

我有一个应用程序使用MS Access 2003前端连接到MS SQL和Sybase数据库。此应用程序使用VBA(Visual Basic 6),这是不能更改的。我们正处于从Windows XP(应用程序运行良好)转换到Windows 7的过程中。如何纠正无法在Windows 7上的Access 2003中加载DAO DLL?

在Windows 7上,尝试连接到Sybase数据库失败。该应用程序使用一个穿过查询,并且当故障发生时,我收到以下消息:

An unexpected error occurred in Call_SP. 
Error number: 48 
Error description: Error in loading DLL 
Error source: Secure open security 

的这何处引发错误代码的特定行是:

For Each qryDef In dbLocal.QueryDefs 

在此的项目行代码的定义是这样的:

Dim dbLocal As Database 
Dim qryDef As QueryDef 

Set dbLocal = CurrentDb() 

当最初启动应用程序,有对Microsoft DAO 3.6对象库缺少的参考。我将dao360.dll文件复制到C:\ Program Files文件(x86)\ Common Files \ Microsoft Shared \ DAO,使用regsvr32.exe注册它,并将引用(工具 - >引用)设置为该文件。

在这一点上,我怀疑这个问题可能与这台机器上的用户权限有关,但我坚持从哪里开始。用户对dao360.dll文件具有“读取和执行”权限。

我们有很多以Access编写的旧版应用程序,因此我们的系统使用Access 2003,但Word,Excel和Outlook 2010。我们正在转向Windows 7 64位。

+1

我想知道的缺少DLL,因为这台电脑从未有过任何比Access 2010中较早但它仍然具有DAO 3.6库。你有没有尝试重新安装Access? – Fionnuala 2012-03-16 21:14:00

+0

VBA 6是不的Visual Basic 6,这类错误地引用原因没有人混乱的结束,尽管微软做它自己。 – Bob77 2012-03-17 02:01:23

回答

2

如果我是你的鞋子,我会尝试以下方法:

  1. 删除并重新安装Access

    而且我会运行注册表清洁喜欢的CCleaner删除从破碎库参考注册表之前重新安装Access并应用所有更新。
    dao360.dll丢失或注册不当的事实表明,该机器至少存在一个安装问题。
    另外,删除并重新安装其他数据库的ODBC驱动程序。在同一台机器上

  2. 尝试从不同的用户

    创建机器上的新用户,然后登录该用户下和检查,如果你仍然得到问题。从不同的机器

    使用同一个数据库

  3. 试试,确保DAO参考选择,并再次尝试代码查询。
    如果它仍然不起作用,那么在某个地方还有另一个问题,并且它不必与DAO相关。

  4. 您提到使用Sybase和SQL Server。

    ODBC驱动程序是否正常运行?机器上是否也存在一些腐败现象?
    如果您创建一个新的数据库并使用相同的连接字符串尝试单个传递查询,该怎么办?

  5. 32位和64位的mixup

    你确定所有相关的软件和数据库驱动程序安装在32位?
    如果您尝试访问使用32位应用程序中的64位驱动程序的ODBC数据源,则它将失败。
    在Win7的X64可从管理工具的ODBC控制台控制面板的是 32位!
    您需要使用C:\Windows\SysWOW64\odbcad32.exe来代替创建DSN。

+0

取消注册DAO DLL,然后重新安装Access已经纠正了这个问题。部分问题似乎是Office 2010(无Access)在Access 2003之后安装。 – Timbuck 2012-03-23 14:57:51

1

我想出的解决方案是使用弱类型,并通过CurrentDb引用所有DAO对象。 我的项目中唯一的引用是VBA和Microsoft Access对象库,它们都是必需的。这有点激进,但它确实给你一些可以在任何平台上部署的东西。

每个新创建的Access数据库的项目都包含对DAO库的引用。但是当数据库部署在不同的机器上时,DAO库引用不再更新。 该功能在Access 2007中被重新命名,当DAO库被重命名时。

在您的例子,这将是:

Dim qryDef As Object 
For Each qryDef In CurrentDb.QueryDefs 
+0

我怀疑你有安装问题。 DAO是MSAccess的一部分,如果没有它,你无法真正编写任何VBA数据库代码。您是否尝试从头开始删除并重新安装Access?另一个奇怪的问题也可能是由于启用了C:驱动器上的压缩引起的。 [我有一个奇怪的问题一次(http://blog.nkadesign.com/2009/ms-access-upsizing-to-sql-server-2008/)与DAO360.DLL,因为它是透明的由OS压缩。 – 2012-03-22 02:55:59

+0

相反,我的VBA项目使用了大量的DAO对象,它只是没有任何对DAO库的引用。你确定你明白打字功能有多弱吗?这是一种用于避免引用COM库的技术,通常用于避免部署问题。 – 2012-03-22 05:16:58

+0

我对后期绑定非常熟悉,谢谢。但是,您应该__not__必须将它用于每个Access版本的默认安装的最基本库。不必诉诸于后期绑定解决内访问本身特定的问题是DLL冲突或腐败的一个很好的指标(可能是注册表)可以由一个完整的重新安装来解决。 – 2012-03-22 05:46:11

1

没有必要尝试重新注册DAO库这里做这样的傻雁追逐,相当于浪费公司资源。在该计算机上安装Access 2003应该可以正常工作,并且在该计算机上安装2003也将正确安装DAO库(试图复制并重新注册DAO库有可能会使您的计算机变成一个完全混乱的地方 - 不要做到这一点,而不是必需的)。

有一些破损的引用或ADO库被放置在引用中较高的DAO库。实际上在VBA编辑器中检查参考。如果ADO未被使用,则删除参考。

此外,如果从此应用程序使用Outlook,然后删除此应用程序中的Outlook引用。您真的需要使用Outlook自动化代码的后期绑定。

自从win 7 beta以来,我在Windows 7 x64上运行Access 2003,并且我在这里没有任何问题。这与x64或win7没有任何关系,但仅限于典型的参考失败行为。

+0

在这个应用程序中没有ADO引用。感谢“鹅追逐”评论 - 我意识到这一点,这就是我最终在这里的结果。 – Timbuck 2012-03-19 12:58:08

0

当x86和x64版本的OS/Access被安装时出现问题。

  1. 您需要创建目录(我敢肯定它不会exsit,你需要管理权限才能做到这一点): C:\ Program Files文件\ Common Files文件\微软共享\ DAO
  2. 复制dao360。 dll从C:\ Program Files(x86)\ Common Files \ microsoft shared \ DAO 添加到在步骤(1)中创建的目录中
  3. 现在在VBA应用程序中添加引用。