在SQL Server上的VFP DBF文件上运行UPDATE和DELETE语句

时间:2012-02-27 14:26:07

标签: sql-server dbf visual-foxpro

我们正在将基于Visual FoxPro的遗留系统迁移到Java,我们需要将SQL Server配置为CRUD系统的DBF文件,因为我们将部分重写系统。因此,员工将同时使用这两个界面,我们需要在两个系统中进行实时更新。

现在,我能够在SQL Server上插入和选择数据,但我无法更新和删除。

我运行以下命令来创建链接服务器:

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

我收到了这个错误:

  

链接服务器“DEN”的OLE DB提供程序“VFPOLEDB”返回消息“多步OLE DB操作生成错误。检查每个OLE DB状态值,如果可用。没有工作。”。

     

Msg 7333,Level 16,State 2,Line 1

     

无法使用OLE DB提供程序“VFPOLEDB”中的书签为链接服务器“DEN”获取行。

如何解决? 感谢。

3 个答案:

答案 0 :(得分: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的另一件事,当表与给定数据库相关联时,一旦打开它,如果没有打开相应的数据库,它将被FORCED打开以利用任何触发器等。因此,您可以简化您的连接,只需指向路径,让剩下的东西为您工作。

另一个注意事项....如果你有一个目录结构,其下有路径,其他位置有数据,例如

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

答案 1 :(得分:1)

使用SQL Server Express 2012 32bit安装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)执行此操作。

答案 2 :(得分:0)

您对链接服务器运气不好:

  

当您使用Visual FoxPro OLE DB提供程序作为SQL Server链接时   服务器,仅支持查询。 Visual FoxPro OLE DB提供程序   不支持通过链接更新,插入或删除操作   服务器

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

而是使用MSDASQL提供程序尝试OPENROWSET并将fox-pro ODBC驱动程序作为第二个参数传递(Driver={Microsoft Visual FoxPro Driver}