我有一个使用MS Access 2003前端连接到MS SQL和Sybase数据库的应用程序。此应用程序使用VBA(Visual Basic 6),这不能更改。我们正处于从Windows XP(应用程序运行正常)到Windows 7的转换过程中。
在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位。
答案 0 :(得分:2)
如果我在你的鞋子里,我会尝试以下方法:
删除并重新安装Access
我会运行一个像CCleaner这样的注册表清理程序,在重新安装Access并应用所有更新之前从注册表中删除损坏的库引用。
dao360.dll丢失或注册不正确的事实表明该机器上至少存在一个安装问题。
另外,删除并重新安装其他数据库的ODBC驱动程序。
尝试来自其他用户的同一台计算机
在计算机上创建新用户,然后在该用户下登录并检查是否仍然出现此问题。
尝试使用其他计算机
使用相同的数据库,确保选择了DAO引用,然后再次尝试代码查询 如果它仍然不起作用,那么在某个地方还有另一个问题,它与DAO无关。
您提到使用Sybase和SQL Server。
ODBC驱动程序是否正常运行?机器上也有腐败吗?
如果您使用相同的连接字符串创建新数据库并尝试单个传递查询,该怎么办?
32位和64位混合
您确定所有依赖软件和数据库驱动程序都是为32位安装的吗?
如果您尝试从32位应用程序访问使用64位驱动程序的ODBC数据源,则会失败
在Win7 x64中,控制面板中管理工具提供的ODBC控制台不 32位!
您需要使用C:\Windows\SysWOW64\odbcad32.exe
来创建DSN。
答案 1 :(得分:1)
我想出的解决方案是使用弱类型,并通过CurrentDb引用所有DAO对象。 我项目中唯一的引用是VBA和Microsoft Access对象库,无论如何都是必需的。它有点激进,但它确实为您提供了可以部署在任何平台上的东西。 / p>
每个新创建的Access数据库的项目都包含对DAO库的引用。但是,在不同计算机上部署数据库时,不再更新DAO库引用。 在重命名DAO库时,Access 2007中已破坏该功能。
在您的示例中,这将是:
Dim qryDef As Object
For Each qryDef In CurrentDb.QueryDefs
答案 2 :(得分:1)
没有必要尝试在这里重新注册dao库,这样做是一场愚蠢的疯狂追逐,相当于浪费公司资源。在该计算机上安装Access 2003应该可以正常工作,并且在该计算机上安装2003也将正确安装DAO库(尝试复制和重新注册DAO库有可能将您的计算机变成一个完整的混乱 - 请勿这样做并且不需要)。
与DAO库相比,有一些损坏的引用或者ADO库可能位于引用的更高位置。实际上检查VBA编辑器中的引用。如果未使用ADO,则删除引用。
此外,如果正在使用此应用程序中的outlook,则删除此应用程序中的outlook引用。您真的需要使用后期绑定Outlook自动化代码。
我从win 7 beta开始在Windows 7 x64上运行Access 2003,我在这里没有问题。这与x64或win7无关,只与典型的破坏引用的行为无关。
答案 3 :(得分:0)
当x86和x64版本的OS / Access被安装时出现问题。