2009-07-27 74 views
0

我在寫一個小軟件,它將成爲使用dbf foxpro表的現有應用程序的一部分。我的應用程序只是讀取2個表格填充數據集並關閉連接,非常快速和簡單。它一直運行,直到其中一個表被使用,或者由foxpro本身(當表被打開時)或主應用程序訪問該表時。閱讀另一個應用程序正在使用的Foxpro表

當它發生在一個得到異常

EX = { 「無法打開文件:C:\ DATA \ myFile.dbf」}錯誤碼= -2147217865

是否可以指定我想訪問它只是爲了閱讀,而不是編輯? PS:我使用VS 2008 C#來訪問它。我的連接字符串的樣子:「供應商= VFPOLEDB.1;數據源= C:\ DATA \」

非常感謝

回答

3

當你提到「FoxPro本身」時,我假設你的意思是有人正在爲DOS或Windows或Visual FoxPro(任何版本)運行FoxPro 2.6。如果是這種情況,請確保用戶在命令中使用以下命令窗口

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驅動程序遵循運行時標準。

裏克Schummer VFP MVP

1

你得到的錯誤代碼是HRESULT 0x80040E37的錯位由沒有按一些中間步驟不知道未簽名的int32's - 這是「無法打開該表」的通用ODBC錯誤(通常是由於錯誤拼寫)。毫無疑問,Foxpro和主應用程序正在使用的庫正在做某種「鎖定」 - 即使ODBC允許您指定您只想讀取,但如果某些其他進程已打開寫入,它仍應被拒絕(兩個或更多的流程只是想讀就可以,但即使只有一個想寫的流程也必須排除所有其他人,讀者或作者)。

如果您在短暫讀取時不能暫時從其他用途中分離.DBF文件,那麼可能會將其複製到另一個名稱(仍然是.DBF),然後嘗試打開該副本 - 執行它工作,還是失敗,同樣的錯誤?在後一種情況下,可能有辦法破解文件,以便清除它的「鎖定狀態」 - 只要它沒有被使用(因爲複製不會,直到你打開它!)。完成讀取後,您可以刪除副本。

問題是,這種方法雖然可能會起作用,但不會完全可靠:它可能是(如果您不幸),foxpro或您的主應用程序可能正在進行更改到數據庫(這就是爲什麼他們會鎖定它 - 畢竟爲了安全起見,他們可以進行更改),並且在您執行復制的那一刻,更改可能會部分但不完全提交到磁盤。你有辦法檢查你正在閱讀的數據是否合理或損壞?如果你可以告訴它已經損壞,你可以簡單地嘗試再讀一遍(希望將新數據保存到磁盤的同時完成),但是如果你不能說這真的是一堆廢話... :-(

I猜測要保留的教訓是,保持數據的某些方法根本不適用於多任務處理的目的 - 請確保在下一次爲您的程序設計任何類型的數據持久性時使用更可靠的方法!

+0

如果另一個程序通過獨佔使用或FLOCK()命令對錶進行鎖定,如何分離DBF?如果該文件正在被另一個程序使用,它將不允許任何打開或分離。 – 2009-07-28 03:06:16

+0

我不知道Foxpro是否使用諮詢鎖(您可以在CopyFile中忽略)或不可破解的鎖(您不能),但即使在後一種情況下也可能有解決方法(例如「外部」文件系統被配置爲不執行牢不可破的鎖),總是與我已經給出的警告當然。 – 2009-07-28 04:03:28

0

除了在實際的FoxPro應用程序的SET EXCLUSIVE OFF裏克斯評論。有幾個實例需要對文件進行真正的鎖定,例如修改結構,打包數據庫(刪除標記爲刪除的記錄),重建索引。如果其中任何一個是鎖定文件的基礎,那麼即使複製也無濟於事,因爲您無法獲取文件句柄,並且/或者複製的結果可能不同步,那麼您的查詢可能會失敗或給出其他錯誤結果。

1

瑞克是正確的。您的Foxpro設置默認爲Foxpro會話授予對「使用」命令打開的任何表的獨佔權。

當您打開表格時,VB應用程序正在運行時,您正在彼此絆倒。

我假設你是雙擊Windows資源管理器中的DBF文件並打開它們,而不是使用Foxpro中的「使用」命令來查看錶格。如果您只想這樣做,那麼(在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文件去。

但是,有一個問題: 自己編譯.prg總是比較好,而不是讓VFP爲你編譯它(如果你不這樣做的話)。一個變化,不要重新編譯,VFP將使用最後編譯的版本(只是爲了貶低你)。

如果你已經知道這個東西,對於矯枉過正的對不起。

祝你好運。

0

這是非常醜陋的,但你可以嘗試通過操作系統與FoxPro應用程序內複製表。如果操作系統處於另一個進程的寫入操作的中間,操作系統甚至可以處理複製和延遲。一旦你複製,如果有一個DBC反向鏈接到文件,你不能打開它,你只需要免費的表.. DROP或FREE,我的記憶失敗了我:)這一切都意味着通用..最好的解決方案是按照建議重新編譯鎖定foxpro軟件,以便它不是唯一的。但是,如果你這樣做,那麼你必須明白爲什麼它可能是獨家開始......故意或只是錯誤的編碼?

相關問題