2012-02-27 243 views
1

我們正在將基於遺留系統的Visual FoxPro遷移到Java,並且我們需要將SQL Server配置爲CRUD系統的DBF文件,因爲我們將重寫系統部分。因此,員工將同時使用這兩個接口,並且我們需要在兩個系統中進行實時更新。在SQL Server上對VFP DBF文件運行UPDATE和DELETE語句

現在,我可以在SQL Server上INSERT和SELECT數據,但我無法更新和刪除。

我已經運行下面的命令來創建鏈接服務器:

sp_addlinkedserver @server = 'DEN', 
@srvproduct = 'foxpro', 
@provider = 'VFPOLEDB.1', 
@datasrc = 'D:\BaseTeste\denny\denny_db.dbc' 

並運行下面的SQL更新表:

UPDATE DEN...produtos SET familia=1 WHERE id=35 

而且我收到此錯誤:

OLE DB provider "VFPOLEDB" for linked server "DEN" returned message "Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.".

Msg 7333, Level 16, State 2, Line 1

Cannot fetch a row using a bookmark from OLE DB provider "VFPOLEDB" for linked server "DEN".

如何解決? 謝謝。

回答

1

我經常使用VFP OleDB,並且在做任何插入,更新,刪除,選擇時都沒有問題。有一點需要注意。您的連接字符串可以指向表所在的目錄。另外,如果特定的.DBC與相關表相關聯,則可以包括數據庫。

當運行一個查詢,插入,更新或刪除,您不需要限定數據庫如

DEN .... produtos(我假設,就是要Denny_db.Produtos - 從而表明Database.Table來運行查詢)。不這樣做...數據庫是開放的,從連接「可見」 ....你就應該能夠做到....

Update Produtos set x = 1 where something = whatever 

or 

insert into Produtos (fld1, fld2, fld3) values (something1, another2, last3) 

VFP的另一件事,當表與給定數據庫相關聯,一旦打開它,如果相應的數據庫沒有打開,它將被強制打開以利用任何觸發器等。所以你可以簡化你的連接以指向路徑,讓剩下的東西爲你工作。

另一個說明....如果你有一個具有其下的路徑與其他地點的數據的目錄結構,如

C:\SomeFolder\MainDataPath\ 
C:\SomeFolder\MainDataPath\SomeArchives\ 
C:\SomeFolder\MainDataPath\OtherFolder\ 

,讓你連接到剛剛"C:\SomeFolder\MainDataPath\"位置,你的查詢可以使用相對路徑來獲得在其他位置的內部數據如

select whatever 
    from SomeRootTable SRT 
     join SomeArchives\SubFolderTable SFT 
     on SRT.KeyID = SFT.LinkKeyID 
+0

嗯,我不能像你說的那樣訪問數據庫,所以我做錯了什麼。當我執行'更新產品SET familia = 1 WHERE id = 35'時,我得到以下錯誤:消息208,級別16,狀態1,行1 **無效的對象名稱'produtos'**'。當我嘗試通過'USE DEN'選擇一個數據庫時,SQL Server返回這個錯誤'Msg 911,Level 16,State 1,Line 1 **無法在數據庫'DEN'的sys數據庫中找到條目。沒有找到該名稱的條目。確保名稱輸入正確。**'。你能幫我解決這個問題嗎?謝謝。 – 2012-02-29 19:49:47

0

你的運氣與鏈接服務器:

When you use Visual FoxPro OLE DB Provider as a SQL Server-linked server, only queries are supported. The Visual FoxPro OLE DB Provider does not support update, insert, or delete operations through a linked server.

http://msdn.microsoft.com/en-us/library/0xzsac67(v=vs.80).aspx

而是嘗試OPENROWSETMSDASQL提供商,並通過狐狸親ODBC驅動程序的第二個參數(Driver={Microsoft Visual FoxPro Driver}

+0

我執行以下語句: SELECT * FROM OPENROWSET( \t 'MSDASQL', \t「驅動程序= {微軟Visual FoxPro驅動程序}; SOURCEDB = {d:\ BaseTeste \丹尼\ denny_db.dbc} ; SourceType中= DBC」, \t 'SELECT * FROM produtos' ) 而收到此錯誤: >消息7399,級別16,狀態1,行 > OLE DB提供程序 「MSDASQL」 鏈接服務器「 (null)「報告了一個錯誤。提供者沒有提供任何關於錯誤的信息。 >消息7303,級別16,狀態1,行1 >無法初始化鏈接服務器「(null)」的OLE DB提供程序「MSDASQL」的數據源對象。 – 2012-02-27 14:51:20

+0

我使用openquery,並且更新語句的實際作品,它只是拋出一個無法避免的錯誤。 – manit 2014-02-21 19:39:51

0

無需安裝與SQL Server Express 2012的32位以下似乎是工作VFPOLEDB:

SELECT * FROM OPENROWSET('VFPOLEDB','D:\dir\file.dbf';'';'','file') 
SELECT * FROM OPENROWSET('VFPOLEDB','D:\dir\file.dbf';'';'','update file set n=2 where n=1') 
SELECT * FROM OPENROWSET('VFPOLEDB','D:\dir\file.dbf';'';'','delete from file where n=2') 
SELECT * FROM OPENROWSET('VFPOLEDB','D:\dir\db2.dbc';'';'','tab2') 
SELECT * FROM OPENROWSET('VFPOLEDB','D:\dir\db2.dbc';'';'','update tab2 set somedate=ctod("12/30/2000") where n=1') 

外核層不便之處在於更新和刪除語句導致錯誤7357告訴您沒有要返回的行。您可以將它封裝在try/catch塊中,並且由於實際語句無論如何都被執行,因此忽略7357作爲預期條件。要使用動態參數,可以通過exec(@sqltext)執行此操作。