通过Delphi TDataSet
后代组件,我们已经成功地使用了DBF/CDX索引文件的Advantage Database Server 9.1 (Netware)好几年了。(这是用于统计/报告目的所需的遗留数据。)
几个星期前,我们从Netware切换到Win2K8作为我们的网络操作系统,并转移到ADS 9.1。这会破坏本地客户端对服务器数据库执行SELECT
查询的查询功能。
例如,下面的查询在ARC32的SQL窗口的Netware版本ADS 9.1中工作得很好,与C:Data
中的空闲表的本地连接运行:
INSERT INTO MyLocalDB
SELECT TOP 10 * FROM [\MyServerDataMyRemoteDB.dbf] WHERE somecondition
相同的查询使用映射到服务器目录的驱动器来工作:
INSERT INTO MyLocalDB
SELECT TOP 10 * FROM [S:DataMyRemoteDB.dbf] WHERE somecondition
注意这是一个自由表——它不是数据字典的一部分。它是一个空闲表,位于对存储它的服务器上的文件夹具有读/写访问权限的位置。本地客户端连接的文件夹是完全可访问的(它用于每天测试应用程序,使用本地连接到数据)。正常的应用程序可以针对本地连接数据或远程连接数据在客户机上运行,而不会出现任何问题。这是只有从本地连接检索服务器数据的查询是一个问题,它之前是正常工作的。唯一的区别是操作系统和ADS都从Netware切换到Win2k8,根据文档(参见下面引用的帮助文件内容),它应该仍然可以工作。
切换到Windows版本的ADS 9.1后,上面两个查询都失败了,
错误7008:指定的表、备忘录文件或索引文件无法打开。表名MyServerDataMyRemoteDB。dbf(或S:DataMyRemoteData.dbf).
我们本周在我们的系统上升级到ADS 10.10(以及ADS 10.10 TDataSet
10.10组件),但上述查询仍然失败。
在Windows版本的ADS下是不支持的吗?文档使第一个看起来应该工作:
表名路径中的驱动器号只能与Advantage Local Server一起使用。当为NT或NetWare使用Advantage Database Server时,完全限定路径必须使用UNC(例如," Server volumepathtable"),因为SQL语句在服务器上解析,而客户端驱动器号是没有意义的。注意,像这样引用的表必须用双引号或[](括号)括起来,因为它们包含非标准字符。
UNC路径用[]
括号正确地括起来,并且在路径或表名中没有任何空格。我尝试过和不附加.dbf
扩展;错误信息保持不变。
我怀疑您遇到了专有锁的更改。对Advantage Database Server进行了更改,使默认行为在使用专有锁定时完全拒绝对其他应用程序的访问。您可以使用名称有点令人困惑的NONEXCLUSIVE PROPRIETARY LOCKING配置设置禁用该功能。我认为如果你把这个配置值设置为1,那么它就会像你想要的那样工作。
将该配置设置更改为1并重新启动ADS后,本地服务器连接应该能够对服务器打开的DBF表进行只读访问。
假设您使用的是远程ADS服务器(不是ALS),您必须使用服务器端别名来获得此功能:
http://devzone.advantagedatabase.com/dz/webhelp/advantage9.0/extprocs/server_side_aliases.htm把它放在MyServer
上的C:adsserver.ini
文件中(或者你的ADS日志所在的任何地方):
[ServerAliases]
Data=X:Data
其中X:Data
是MyRemoteDB.dbf
表文件的位置。
但是,这只会正常工作,如果也有一个共享或你设置了IgnoreRights
设置:
服务器端别名必须始终与优势客户端的"忽略权限"设置一起使用。有关详细信息,请参见数据库安全主题。如果不这样做,将导致文件存在性检查,该检查将使用来自客户机的服务器端别名并失败,从而导致AE_FILE_NOT_FOUND(5004)错误。
对于ALS,您可以使用普通的Windows文件共享