Запустите операторы UPDATE и DELETE для файлов VFP DBF на SQL Server. - PullRequest
1 голос
/ 27 февраля 2012

Мы переносим нашу унаследованную систему на основе Visual FoxPro на Java, и нам нужно настроить SQL Server для CRUD-файлов системы DBF, потому что мы будем переписывать систему по частям.Таким образом, сотрудники будут использовать оба интерфейса одновременно, и нам нужны обновления в реальном времени в обеих системах.

Сейчас я могу вставлять и выбирать данные на SQL Server, но не могу выполнить ОБНОВЛЕНИЕ иDELETE.

Я выполнил следующую команду для создания связанного сервера:

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

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

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Я регулярно использую VFP OleDB, и у меня нет проблем с ЛЮБОЙ вставкой, обновлением, удалением, выбором ... Одна вещь, на которую следует обратить внимание.Строка подключения может указывать либо на каталог, где расположены таблицы.Кроме того, база данных может быть включена, если с указанными таблицами связан определенный .DBC.

При выполнении запроса, вставки, обновления или удаления не требуется указывать базу данных, например * 1003.*

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
1 голос
/ 04 декабря 2013

Установив 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')

Единственное неудобство заключается в том, что операторы update и delete приводят к ошибке 7357, сообщающей, что строки не возвращаются.Вы можете заключить его в блок try / catch и игнорировать 7357 как ожидаемое условие, так как фактические операторы были выполнены в любом случае.Чтобы использовать динамические параметры, можно выполнить это через exec(@sqltext).

0 голосов
/ 27 февраля 2012

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

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

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

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

...