Что нового

Работа с таблицами DBF через ADO

pvnn

Осваивающий
Сообщения
282
Репутация
31
Всем привет.
Появилась необходимость подключиться к DBF. Таблицы, которые создавались в Visual Fox Pro стандартным провайдером: Microsoft.Jet.OLEDB.4.0 не подключаются, ошибка: "Внешняя таблица не имеет предполагаемый формат"
Все же удалось найти решение, думаю, что кому-нибудь это сможет пригодиться.

Решение такое:
- Скачиваем Провайдер: Microsoft OLE DB Provider for Visual FoxPro 9.0 https://www.microsoft.com/en-us/download/details.aspx?id=14839
- Устанавливаем
- Пишем запросы

Тестировал на Win 7 x64
Плюсы: не нужно использовать всякие UDF, DLL, которые могут не работать с вашей версией Autoit. Используем простые SQL-запросы
Минус: нужно устанавливать провайдер.

Код:
#Include <Array.au3>

; Обработчик COM-ошибок
Global $oErrorHandler = ObjEvent("AutoIt.Error", "_ErrFunc")


; Создать объект подключения
$oADOCon = ObjCreate("ADODB.Connection")
If @error Then Exit MsgBox(0,'Error',_ErrDescription())

[email protected] ; Каталог, где находятся таблицы DBF

; Стандартный провайдер для подключения к DBF. Внимание! не работает с новыми таблицами, созданными в VFP
;~ $sADOConStr = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
;~ 			  "Data Source=" & $FilePath & ";" & _
;~ 			  "Extended Properties=""dBASE IV;"";"
;~ $oADOCon.Open($sADOConStr)
;~ If @error Then Exit MsgBox(0,'Error',_ErrDescription())

; Строка подключения. Провайдер Microsoft OLE DB Provider for Visual FoxPro 9.0 (https://www.microsoft.com/en-us/download/details.aspx?id=14839)
$sADOConStr = "Provider=VFPOLEDB.1;" & _
			  "Data Source=" & $FilePath & ";" & _
			  "Collating Sequence=MACHINE;"
; Подключение
$oADOCon.Open($sADOConStr)
If @error Then Exit MsgBox(0,'Error',_ErrDescription())


; Выполнить запрос
$oQuery = $oADOCon.Execute("SELECT * FROM Config")
If @error Then Exit MsgBox(0,'Error select',_ErrDescription())

; Массив
$aQuery=$oQuery.GetRows()

; Вывод на экран
_ArrayDisplay($aQuery)
Exit


; Возвращает описание последней ошибки SQL-запроса
Func _ErrDescription($sDescription = Default)
	Local Static $sDescription_static = ''
	If $sDescription <> Default Then $sDescription_static = $sDescription
	Return $sDescription_static
EndFunc   ;==>_ErrDescription

Func _ErrFunc($oError)
	ConsoleWrite(@CRLF& _
			@ScriptName & " (" & $oError.scriptline & ") : ==> COM Error intercepted !" & _
			"$oError.description is: " & @TAB & $oError.description & @CRLF & _
			"$oError.windescription: " & @TAB & $oError.windescription & @CRLF & _
			"$oError.number is: " & @TAB & Hex($oError.number, 8) & @CRLF & _
			"$oError.lastdllerror is: " & @TAB & $oError.lastdllerror & @CRLF & _
			"$oError.scriptline is: " & @TAB & $oError.scriptline & @CRLF & _
			"$oError.source is : " & @TAB & $oError.source & @CRLF & _
			"$oError.helpfile is: " & @TAB & $oError.helpfile & @CRLF & _
			"$oError.helpcontext is: " & @TAB & $oError.helpcontext & @CRLF)
	_ErrDescription($oError.description)
EndFunc   ;==>_ErrFunc
 
Верх