我正在编写一个小软件,它将成为使用dbf foxpro表的现有应用程序的一部分。我的应用程序只读取2个表填充数据集并关闭连接,非常快速和简单。它可以使用其中一个表或foxpro本身(当表打开时)或主应用程序访问该表时。
当它发生时获得异常
ex = {“无法打开文件c:\ data \ myFile.dbf。”} ErrorCode = -2147217865
是否可以指定我只是为了阅读而不是编辑来访问它?
PS:我正在使用VS 2008 C#来访问它。我的连接字符串如下所示:“Provider = VFPOLEDB.1; Data Source = C:\ data \”
非常感谢
答案 0 :(得分:3)
当你提到“FoxPro本身”时,我假设有人正在运行FoxPro 2.6 for DOS或Windows或Visual FoxPro(任何版本)。如果是这种情况,请确保用户在命令窗口中使用以下命令
SET EXCLUSIVE OFF
或者他们可以打开每个表并在每个USE命令上包含SHARED子句。
如果您指的是在FoxPro中开发的应用程序针对数据运行,则您的情况稍微复杂一些,因为该应用程序可以设计为单用户并且在代码中具有SET EXCLUSIVE ON。在这种情况下你最好的镜头是尝试修改现有的Config.FP或Config.FPW(取决于版本)并添加一行:
EXCLUSIVE = OFF
或者,如果文件不存在,您可以创建该文件。如果这不起作用,您将需要应用程序源代码来更改它,以便它不会独占打开表。
至于在C#程序中使用VFP OLE DB驱动程序,可以在EXCLUSIVE = OFF的文件夹中包含Config.FPW文件,它将确保您以共享模式打开文件,以防万一正在尝试独家使用。这不太可能,因为运行时版本不默认为独占打开,并且OLE DB驱动程序遵循运行时标准。
Rick Schummer VFP MVP
答案 1 :(得分:1)
你得到的错误代码是HRESULT 0x80040E37,因为某些中间步骤不知道unsigned int32的错误 - 这是“无法打开该表”的通用ODBC错误(通常是由于错误拼写)。毫无疑问,Foxpro和主要应用程序正在使用的libs正在进行某种“锁定” - 即使ODBC允许您指定您只想要读取,如果某些其他进程已打开进行写入,仍应拒绝(只是想要阅读的两个或更多个进程会很好,但即使只是想要写的人也必须排除所有其他人,读者或作者)。
如果您在短暂阅读时无法暂时将.DBF文件从其他用途中删除,那么一种方法可能是将其复制到另一个名称(仍然是.DBF)并尝试打开该副本 - 是否工作,或仍然失败,同样的错误?在后一种情况下,可能有办法破解文件,因此它的“锁定状态”被清除 - 只要它没有被使用(因为副本不会,直到你设法打开它! - )。完成阅读后,您可以删除副本。
问题是,这种方法虽然可能会起作用,但并不完全可靠:它可能是可能(如果你运气不好)foxpro或你的主应用可能在在更改数据库的过程中(这就是他们为什么要锁定它的原因 - 为了安全起见,他们可以进行更改),并且在您执行复制的那一刻,更改可能部分但不完全提交到磁盘。您是否有办法检查您正在阅读的数据是否合理或已损坏?如果你能说它已损坏,你可以再次尝试再次阅读(希望同时完成将新数据保存到磁盘),但如果你不能说这真的是一个废话......: - (
我想要保留的教训是,保留数据的某些方法根本不适用于多任务目的 - 确保在下次为程序设计任何类型的数据持久性时使用更加可靠的方法!
答案 2 :(得分:1)
瑞克是对的。您的Foxpro设置默认为Foxpro会话授予“use”命令打开的任何表的独占权。
当你打开桌子时,VB应用程序正在运行时,你正在互相绊脚。
我假设你在Windows资源管理器中双击DBF文件并打开它们而不是在Foxpro中使用“use”命令来查看表格。如果您只想这样做,那么(在VFP 9中)关闭除VFP之外的所有会话。转到工具 - >选项 - >数据选项卡并取消选中“打开独占”。现在关闭那个会话。这将保存设置。下次双击DBF / DBC时,它将打开所有具有“共享”访问权限的表。
否则,要使用“use”命令从VFP中访问表,请执行:
独家访问:
use in 0 exclusive <table-file-path>
对于共享访问:
use in 0 shared <table-file-path>
你也可以给它一个noupdate标志,使其成为只读。 (安全的查询方式。)
use in 0 exclusive noupdate <table-file-path>
或
use in 0 shared noupdate <table-file-path>
从我理解的方式来看,主要问题是VB接管数据库的“独占”权限,并在打开表(共享或其他方式)时崩溃。
然而,这听起来更像是一个时间问题而不是Foxpro。假设您没有权限重写VB应用程序,唯一的另一种选择是找到主VB应用程序未运行的时间(可能是深夜?)并运行Foxpro查询(。 PRG文件)在调度程序上。查询可以复制到另一个文件,例如Alex建议。
运行Foxpro程序的命令很简单:
foxpro <program-name>.prg
这可以放在由通用调度程序运行的.bat或.cmd文件中。
然而,有一个问题: 最好自己在VFP中编译.prg,而不是让VFP为你编译它(如果你不这样做的话,那就是它。)另外,如果你进行了更改而不重新编译,VFP将使用最后编译版本(只是为了惹你生气。)
如果你已经知道这些东西,那就太过分了。
祝你好运。答案 3 :(得分:0)
除了Ricks对实际Foxpro应用程序中SET EXCLUSIVE OFF的评论。有一些实例需要对文件进行真正的锁定,例如修改结构,打包数据库(删除标记为删除的记录),重建索引。如果其中任何一个是锁定文件的基础,那么即使复制也无济于事,因为你无法获得文件句柄,和/或副本的结果可能不同步,那么你的查询就可以了失败或给出其他错误结果。
答案 4 :(得分:0)
这很丑陋,但您可以尝试通过操作系统vs从Foxpro应用程序中复制表格。如果操作系统处于来自另一个进程的写入操作的中间,则操作系统甚至可能能够处理副本并延迟。一旦你复制,如果有一个DBC反向链接到文件,你无法打开它,你只需要释放表.. DROP或FREE,我的记忆失败了我:)这是所有意味着通用..最好的解决方案是按照建议重新编译锁定的foxpro软件,这样它就不是独占的。但是,如果你这样做,那么你必须理解为什么它可能是独家的开始...故意或只是糟糕的编码?