2012-02-27 240 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)执行此操作。