我一直在研究一个API,通过PHP(v7.3)使用ADODB(v5.20.14)在FoxPro数据库上运行查询。目前,我的工作解决方案使用XAMPP(3.2.2 x86),运行在Windows 2019服务器上。FoxPro驱动(6.01.8629.01)。
我现在试图使用IIS 10让这个相同的设置工作,然而,我遇到了一个奇怪的问题,如果我同时向Web服务器发送请求,只有最后一个请求才能成功返回数据,问题在于 $db->connect
. 这是我使用的连接代码。
require_once('adodb/adodb.inc.php');
$db = NewADOConnection("vfp");
$ADODB_FETCH_MODE = ADODB_FETCH_ASSOC;
$db->debug = true;
$db->connect("DSN=Visual FoxPro Database;UID=;SourceDB=<UNC PATH>.DBC;SourceType=DBC;Exclusive=No;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=Yes;") or die("Failed to connect.");
除了最后一个请求之外,我得到的错误是:
odbc_connect(): SQL error: [Microsoft][ODBC Visual FoxPro Driver]This file is incompatible with the current version of Visual FoxPro. Run 30UPDATE.PRG to update the file to the current version., SQL state S1000 in SQLConnect
我发现了这个 KB文章 上的错误,这似乎表明这是一个错误的错误;这是误导。
如果你多次从多个Visual FoxPro 6.0可执行文件中打开位于服务器上的数据库,那么就会随机出现以下错误。
该文件与当前版本的Visual FoxPro不兼容。运行30UPDATE.PRG将文件更新到当前版本。
如果您使用ADO或Visual FoxPro ODBC驱动程序打开Visual FoxPro 6.0数据库,也可能出现此错误。
我相信这并没有什么帮助,因为通过XAMPP执行时可以,只是IIS不能。IIS应用池设置为使用x86作为ADODB,而FoxPro驱动需要32位。
我不知道是什么原因导致了这种行为,为什么每次最后一个请求都能成功,建立了与dB的连接并成功返回数据。
不幸的是,这似乎是6.x版本的VFP驱动的问题,不会被修复,因为VFP在几年前就已经寿终正寝了;对v9的扩展支持在2015年就结束了,你可以看一下生命周期 此处.
我不能说IIS和XAMPP的区别,但它们使用的底层技术不同。
考虑到VFP的年代,我推测你是用v6来支持旧系统?在这种情况下,除了使用支持VFP的第三方xBase驱动外,没有其他办法解决这个问题,外面有很多,应该适用于你现有的设置。
你说的是ADODB,但错误地使用了ODBC驱动,最新的版本是6.x,你不能用该驱动访问新版本的VFP表。请使用VFPOLEDB驱动,它与ADODB(32位)配合得非常好。不幸的是,我没有使用PHP,所以我不能用PHP举例。