读取另一个应用程序正在使用的Foxpro表

读取另一个应用程序正在使用的Foxpro表,foxpro,Foxpro,我正在编写一个小软件,它将成为使用dbf foxpro表的现有应用程序的一部分。我的应用程序只需读取两个表并填充一个数据集,然后关闭连接,非常快速和简单。它会一直工作,直到其中一个表被使用,或由foxpro本身(当该表被打开时)或由主应用程序访问该表为止 当发生异常时,获取异常 ex={“无法打开文件c:\data\myFile.dbf。”}错误代码=-2147217865 是否可以指定我要访问它只是为了阅读,而不是编辑 PS:我正在使用VS2008C#访问它。我的连接字符串看起来像:“Prov

我正在编写一个小软件,它将成为使用dbf foxpro表的现有应用程序的一部分。我的应用程序只需读取两个表并填充一个数据集,然后关闭连接,非常快速和简单。它会一直工作,直到其中一个表被使用,或由foxpro本身(当该表被打开时)或由主应用程序访问该表为止

当发生异常时,获取异常

ex={“无法打开文件c:\data\myFile.dbf。”}错误代码=-2147217865

是否可以指定我要访问它只是为了阅读,而不是编辑

PS:我正在使用VS2008C#访问它。我的连接字符串看起来像:“Provider=VFPOLEDB.1;数据源=C:\Data\”


非常感谢

您得到的错误代码是HRESULT 0x80040E37,因为某些中间步骤不知道未签名的int32,这是“无法打开该表”的一般ODBC错误(通常是由于拼写错误)。毫无疑问,Foxpro和主应用程序使用的libs正在进行某种“锁定”——即使ODBC允许您指定只想读取,但如果其他进程将其打开以进行写入,则仍应拒绝该操作(两个或两个以上的进程只想阅读就可以了,但即使只有一个进程想写,也必须排除所有其他进程,读者或作者)

如果在短暂读取时无法暂时将.DBF文件与其他用途分离,那么一种方法可能是将其复制到另一个名称(仍然是.DBF)并尝试打开该副本--它是否工作,或者仍然失败并出现相同的错误?在后一种情况下,可能有方法可以破解该文件以使其处于“锁定状态”已清理--只要它未被使用(在您设法打开它之前,副本不会被使用!-)。一旦您完成了所需的读取,您可以删除副本

问题是,这种方法虽然可以实现,但并不完全可靠:有可能(如果你运气不好的话)foxpro或你的主应用程序正在对DB进行更改(这就是为什么他们锁定DB,毕竟,为了安全起见,他们可以进行更改),并且在您执行复制时,更改可能部分但不是全部提交到磁盘。您是否有办法检查您正在读取的数据是否合理或已损坏?如果您可以判断数据是否已损坏,您只需再次尝试读取(希望新数据已保存到磁盘),但如果你不知道这真的是一场恶作剧…:-(


我想应该吸取的教训是,某些持久化数据的方法并不完全适用于多任务目的——请确保在下次为程序设计任何类型的数据持久化时使用更可靠的方法!

您得到的错误代码是HRESULT 0x80040E37,被一些不知道的中间步骤弄乱了关于未签名的int32——这是“无法打开该表”(通常是由于拼写错误)的一般ODBC错误。毫无疑问,Foxpro和主应用程序使用的LIB正在进行某种“锁定”——即使ODBC允许您指定只想读取,但如果其他进程将其打开以进行写入,则仍应拒绝该错误(两个或两个以上的进程只想阅读就可以了,但即使只有一个进程想写,也必须排除所有其他进程,读者或作者)

如果在短暂读取时无法暂时将.DBF文件与其他用途分离,那么一种方法可能是将其复制到另一个名称(仍然是.DBF)并尝试打开该副本--它是否工作,或者仍然失败并出现相同的错误?在后一种情况下,可能有方法可以破解该文件以使其处于“锁定状态”已清理--只要它未被使用(在您设法打开它之前,副本不会被使用!-)。一旦您完成了所需的读取,您可以删除副本

问题是,这种方法虽然可以实现,但并不完全可靠:有可能(如果你运气不好的话)foxpro或你的主应用程序正在对DB进行更改(这就是为什么他们锁定DB,毕竟,为了安全起见,他们可以进行更改),并且在您执行复制时,更改可能部分但不是全部提交到磁盘。您是否有办法检查您正在读取的数据是否合理或已损坏?如果您可以判断数据是否已损坏,您只需再次尝试读取(希望新数据已保存到磁盘),但如果你不知道这真的是一场恶作剧…:-(


我想应该吸取的教训是,某些持久化数据的方法并不完全适用于多任务的目的——请确保下次为您的程序设计任何类型的数据持久化时使用更可靠的方法!

当您提到“FoxPro本身”时,我是在做一个假设您的意思是有人正在运行FoxPro 2.6 for DOS或Windows,或Visual FoxPro(任何版本)。如果是这种情况,请确保用户在命令窗口中使用以下命令

SET EXCLUSIVE OFF
或者,它们可以打开每个表,并在每个USE命令中包含SHARED子句

如果您指的是在FoxPro中开发的应用程序,该应用程序针对数据运行,情况会稍微复杂一些,因为该应用程序可以设计为单用户,并且在代码中有一个独占的设置。在这种情况下,您最好尝试修改现有的Config.FP或Config.FPW(取决于版本)并添加一行:

EXCLUSIVE = OFF
或者,如果文件不存在,您可以创建该文件。如果该文件不存在,则需要应用程序源代码对其进行更改,以使其不会以独占方式打开表

至于在C#程序中使用VFP OLE DB驱动程序,您可以在EXCLUSIVE=OFF的文件夹中包含Config.FPW文件,这将确保您以共享模式打开文件,以防您尝试独占使用。这不太可能,因为运行时版本不默认为独占打开,OLE DB驱动程序为follo为runti展翅
use in 0 exclusive <table-file-path>
use in 0 shared <table-file-path>
use in 0 exclusive noupdate <table-file-path>
use in 0 shared noupdate <table-file-path>
foxpro <program-name>.prg