Запускайте операторы UPDATE и DELETE для файлов VFP DBF на SQL Server.

Мы переносим нашу унаследованную систему на основе 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

И я получил эту ошибку:

Поставщик OLE DB VFPOLEDB для связанного сервера DEN вернул сообщение Многоэтапная операция OLE DB вызвала ошибки. Проверьте каждое значение состояния OLE DB, если оно доступно. Работы не было..

Сообщение 7333, уровень 16, состояние 2, строка 1

Не удается получить строку с помощью закладки поставщика OLE DB VFPOLEDB для связанного сервера DEN.

Как это решить? Спасибо.


person Danniel Magno    schedule 27.02.2012    source источник


Ответы (3)


Я регулярно использую 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
person DRapp    schedule 29.02.2012
comment
Ну, я не могу получить доступ к базе данных, как вы говорите, значит, я делаю что-то не так. Когда я выполняю UPDATE produtos SET familia=1 WHERE id=35, я получаю следующую ошибку Msg 208, Level 16, State 1, Line 1 **Invalid object name 'produtos'**. Когда я пытаюсь выбрать базу данных с помощью USE DEN, SQL Server возвращает эту ошибку Msg 911, Level 16, State 1, Line 1 **Could not locate entry in sys databases for database 'DEN'. No entry found with that name. Make sure that the name is entered correctly.**. Не могли бы вы помочь мне решить эту проблему? Спасибо. - person Danniel Magno; 29.02.2012

После установки VFPOLEDB с 32-разрядной версией SQL Server Express 2012, похоже, работает следующее:

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).

person slar    schedule 04.12.2013

Вам не повезло со связанным сервером:

При использовании Visual FoxPro OLE DB Provider в качестве сервера, связанного с SQL Server, поддерживаются только запросы. Поставщик Visual FoxPro OLE DB не поддерживает операции обновления, вставки или удаления через связанный сервер.

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

Вместо этого попробуйте OPENROWSET с поставщиком MSDASQL и передайте драйвер ODBC fox-pro как второй аргумент (Driver={Microsoft Visual FoxPro Driver})

person Alex K.    schedule 27.02.2012
comment
Я выполнил следующую инструкцию: SELECT * FROM OPENROWSET('MSDASQL', 'Driver={Microsoft Visual FoxPro Driver}; SourceDB={D:\BaseTeste\denny\denny_db.dbc}; SourceType=DBC', 'SELECT * FROM produtos' ) И получил эту ошибку: › Сообщение 7399, уровень 16, состояние 1, строка 1 › Поставщик OLE DB MSDASQL для связанного сервера (нулевой) сообщил об ошибке. Провайдер не дал никакой информации об ошибке. › Сообщение 7303, уровень 16, состояние 1, строка 1 › Не удается инициализировать объект источника данных поставщика OLE DB MSDASQL для связанного сервера (нулевой). - person Danniel Magno; 27.02.2012
comment
Я использую openquery, и операторы обновлений фактически работают, он просто выдает ошибку, которую нельзя избежать. - person manit; 21.02.2014