:: Не фоксом единым
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Более или менее понятно. Спасибо!

И насчет IBExpert. Разработчики этой штуки придумали теперь регистрацию. И если выбрать персональную лицензию free, то в этой версии нет возможности выполнять экспорт данных из файла FireBird. Можно только выполнить экспорт в формат SQL, а с этим форматом надо изрядно повозиться, чтобы перегнать данные в тот же DBF.

Такие дела... (С) Foxtrot
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Simple777
Такие дела... (С) Foxtrot
В оригинале:
so it goes
(C) Курт Воннегут


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Цезарь

Сообщений: 127
Дата регистрации: 25.02.2012
Simple777
Можно только выполнить экспорт в формат SQL, а с этим форматом надо изрядно повозиться, чтобы перегнать данные в тот же DBF.
Да ладно, что там сложного? Вот преобразование в обратную сторону (из DBF в SQL):
* Формирование SQL-файла с командами INSERT на основании DBF-таблицы
* tcDbfname - имя DBF-таблицы
* tnRecnum - начальный номер записи (0 или не число - вся таблица)
* tnPartsize - максимальное количество команд INSERT в одном SQL-файле (не число - не ограничено)
PROCEDURE dbf2sql
PARAMETERS tcDbfname, tnRecnum, tnPartsize
SET TALK OFF
SET STATUS OFF
SET DELETED ON
SET DATE GERMAN
SET CENTURY ON
SET NULL ON
SET ANSI ON
SET EXACT ON
LOCAL lnSql && SQL-файл
LOCAL llSqlopen && Признак открытия SQL-файла
LOCAL lnPartnum && Счетчик SQL-файлов
LOCAL lcPartname && Метка номера SQL-файла в имени
LOCAL lnInpart && Счетчик записей в SQL-файле
LOCAL lcInsert && Одна команда INSERT (постоянная часть)
LOCAL lcValues && Одна команда INSERT (значения полей)
LOCAL laField[1] && Список полей DBF-таблицы
LOCAL laNames[1] && Список длинных имен полей DBF-таблицы
LOCAL lnIfield && Счетчик полей DBF-таблицы
LOCAL lnNfield && Количество полей DBF-таблицы
LOCAL lcName && Имя поля DBF-таблицы
LOCAL luValue && Значение поля DBF-таблицы
CLOSE DATABASES
USE (tcDbfname) IN 0 NOUPDATE ALIAS dbffile
IF FILE('sqlnames.DBF')
USE sqlnames IN 0 NOUPDATE
ENDIF
IF USED('dbffile')
lnNfield = AFIELDS(laField,'dbffile')
DIMENSION laNames[lnNfield]
lcInsert = 'INSERT INTO '+tcDbfname+' ('
FOR lnIfield=1 TO lnNfield
laNames[lnIfield] = LOWER(laField[lnIfield,1])
IF LEN(laNames[lnIfield])=10 AND USED('sqlnames')
SELECT sqlnames
LOCATE FOR ALLTRIM(tablename)==tcDbfname AND;
(shortname==laNames[lnIfield] OR (EMPTY(shortname) AND;
LEFT(fieldname,10)==laNames[lnIfield]))
IF FOUND()
laNames[lnIField] = ALLTRIM(sqlnames.fieldname)
ENDIF
ENDIF
lcInsert = lcInsert+IIF(lnIfield>1,', ','')+tcDbfname+laNames[lnIfield]
ENDFOR
lcInsert = lcInsert+') VALUES ('
IF TYPE('tnRecnum')='N' AND !EMPTY(tnRecnum)
GO tnRecnum IN dbffile
ELSE
GO TOP IN dbffile
ENDIF
llSqlopen = .F.
lnPartnum = 0
DO WHILE !EOF('dbffile')
IF !llSqlopen
lnPartnum = lnPartnum+1
lcPartname = IIF(TYPE('tnPartsize')='N','_'+;
CHRTRAN(STR(lnPartnum,3),' ','0'),'')
lnSql = FCREATE('import_'+tcDbfname+lcPartname+'.sql')
IF lnSql<0
EXIT
ENDIF
=FPUTS(lnSql,STRCONV([SET statement_timeout = 0;],9))
=FPUTS(lnSql,STRCONV([SET client_encoding = 'UTF8';],9))
=FPUTS(lnSql,STRCONV([SET standard_conforming_strings = on;],9))
=FPUTS(lnSql,STRCONV([SET check_function_bodies = false;],9))
=FPUTS(lnSql,STRCONV([SET client_min_messages = warning;],9))
=FPUTS(lnSql,STRCONV([SET search_path = public, pg_catalog;],9))
llSqlopen = .T.
lnInpart = 0
ENDIF
lcValues = ''
FOR lnIfield=1 TO lnNfield
lcValues = lcValues+IIF(lnIfield>1,', ','')
lcName = 'dbffile.'+laField[lnIfield,1]
DO CASE
CASE ISNULL(&lcName)
lcValues = lcValues+'NULL'
CASE laField[lnIfield,2]='C' OR laField[lnIfield,2]='M'
luValue = ALLTRIM(&lcName)
IF LEN(luValue)>=3 AND LEFT(luValue,3)=='GEO'
lcValues = lcValues+luValue
ELSE
lcValues = lcValues+[']+luValue+[']
ENDIF
CASE laField[lnIfield,2]='D'
luValue = DTOS(&lcName)
lcValues = lcValues+[']+SUBSTR(luValue,1,4)+[-]+;
SUBSTR(luValue,5,2)+[-]+SUBSTR(luValue,7,2)+[']
CASE laField[lnIfield,2]='T'
luValue = TTOC(&lcName,3)
lcValues = lcValues+[']+SUBSTR(luValue,1,10)+[ ]+;
SUBSTR(luValue,12,8)+[']
CASE laField[lnIfield,2]='L'
luValue = IIF(&lcName,'true','false')
lcValues = lcValues+luValue
CASE laField[lnIfield,2]='N'
IF laField[lnIfield,4]>0
luValue = ALLTRIM(STR(&lcName,laField[lnIfield,3],;
laField[lnIfield,4]))
ELSE
luValue = ALLTRIM(STR(&lcName,laField[lnIfield,3]))
ENDIF
lcValues = lcValues+luValue
ENDCASE
ENDFOR
=FPUTS(lnSql,STRCONV(lcInsert+lcValues+');',9))
lnInpart = lnInpart+1
IF TYPE('tnPartsize')='N' AND lnInpart>=tnPartsize
=FCLOSE(lnSql)
llSqlopen = .F.
ENDIF
SKIP IN dbffile
ENDDO
IF llSqlopen
=FCLOSE(lnSql)
llSqlopen = .F.
ENDIF
ENDIF
CLOSE DATABASES
RETURN
А чтобы перегнать из SQL в DBF, можно читать SQL-файл построчно, править синтаксис под Фокс, писать в PRG-файл. Потом полученный файл запустить в Фоксе. Фокс ведь тоже понимает CREATE TABLE и INSERT INTO.
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
IBExpert формирует файл в формате SQL, как я понимаю, в формате для Firebird.

Кроме того, при обработке файла из формата sql попадались символы с ASCII <32, что приводило с разбиению считываемой строки на несколько строк.
Это все можно обработать, но зачем, если через ODBC конвертирование таблицы из файла Firebird выполняется в 2 строки?
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Цезарь
Да ладно, что там сложного?
Обработка всяких "нюансов" - например экранирование зарезервированных символов в строках (ты попробуй сформируй для фокса команду INSERT вставляющую строчку содержащую одновременно ВСЕ виды фоксовых кавычек - одинарные, двойные, квадратные скобки), обработка дат, blob-полей (если таковые есть), логических полей и т.п.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Цезарь

Сообщений: 127
Дата регистрации: 25.02.2012
Igor Korolyov
Цезарь
Да ладно, что там сложного?
Обработка всяких "нюансов" - например экранирование зарезервированных символов в строках (ты попробуй сформируй для фокса команду INSERT вставляющую строчку содержащую одновременно ВСЕ виды фоксовых кавычек - одинарные, двойные, квадратные скобки), обработка дат, blob-полей (если таковые есть), логических полей и т.п.
А как Firebird выводит кавычки внутри строковых констант? В PostgreSQL строковая константа всегда ограничена апострофами, а апострофы внутри строки экранируются: '' или \'. В SQL-файле, создаваемом Phppgadmin, выводится ''. Для Фокса только эту подстроку и надо заменить:
=FPUTS(lnHandle,[INSERT INTO mytable VALUES (]+STRTRAN(lcValue,[''],['+"'"+'])+[)]
Здесь предполагается, что lcValue - значение поля, прочитанное из SQL-файла вместе с ограничивающими апострофами.
Сложнее с типами данных, которых нет в Фоксе. С другой стороны, как вообще адекватно представить в DBF, например, типы данных GEOGRAPHY?
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Цезарь

Сообщений: 127
Дата регистрации: 25.02.2012
Simple777
IBExpert формирует файл в формате SQL, как я понимаю, в формате для Firebird.
Кроме того, при обработке файла из формата sql попадались символы с ASCII <32, что приводило с разбиению считываемой строки на несколько строк.
Хм... В более знакомых мне Phppgadmin и Phpmyadmin при экспорте в SQL-файл создается простой текстовый файл с последовательностью команд. Правда, кодировка по умолчанию utf-8, так что символы с ASCII <32 там, конечно, есть.
Simple777
Это все можно обработать, но зачем, если через ODBC конвертирование таблицы из файла Firebird выполняется в 2 строки?
Но попытка парсинга GDB-файла всё же была
Когда вместо доступа к базе данных есть только веб-приложение, способное только сохранить таблицы в SQL или CSV, приходится изобретать велосипеды.
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Цезарь
А как Firebird выводит кавычки
Их выводит не FB/IB а утилита IBExpert. Да и я ж сказал - это только "например" Есть и другие спецкоды, те же переводы строки - там вообще жуть если будет смешение Win/*Nix стандартов (одиночные/двойные CR+LF), блобы опять таки.
Вопрос не в том что "невозможно" а в том что ЕСТЬ сложности Но самое главное, если есть вариант прямого доступа (тот же ODBC) то пляски вокруг препроцессинга .sql файлов не нужны


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Нынче попробовал законнектиться к Firebird из Win 7 32 при помощи ODBC-драйвера. Делаю все в точности так, как и для Win XP.

Установил драйвер с сайта производителя (притом более новый, чем для XP), проинсталлировал. Запустил VFP 9 (со всеми дополнениями) в режиме администратора.

Выполнил команду:

lnHandle = SQLSTRINGCONNECT("DRIVER=Firebird/InterBase(r) driver; DBNAME=d:\mydir\myfile.GDB;UID=SYSDBA;PWD=masterkey")

lnHandle возвращает -1.

Попробовал настроить соединение в режиме диалога.

Ввел все, что в таких случаях полагается:

[attachment 26390 firebird.jpg]

При проверке соединения пишет:


[attachment 26391 firebird2.jpg]


На всякий случай дал дополнительные права доступа к папке, где находится файл GDB. Не помогло.


В чем еще может быть причина?

Вроде бы есть функции в VFP9, позволяющие более подробно посмотреть, в чем состоит ошибка.



Исправлено 1 раз(а). Последнее : Simple777, 22.11.16 12:00
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
AERROR()


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Код ошибки узнал:

1466

Connection Handle is invalid


Дык и без кода ошибки было ясно, что invalid.

Вот что пишется об этом коде ошибки в хелпе:

Цитата:
Соединение с источником данных разрушено, не действительно.

Используйте функции SQLCONNECT( ) или SQLSTRINGCONNECT( ) для создания дескриптора соединения (Connection Handle).
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
Добейся соединения с сервером через визард ODBC, посмотри, что пишет сервер в свой лог.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Дык я же вроде через Wizard и пытался соединяться в приводимых картинках. Или имеется в виду еще какой-то способ?

Тут ить дело-то какое? Все должно работать - нету ошибок. Но есть некие особенности у Win7 по сравнению с XP. Мне почему-то думается, что дело тут в недостаточности прав у фокса или еще у какого-то софта. Может быть, надо dll зарегистрировать еще? В Win XP ничего такого не делал - все работало.
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
И насчет сервера - у меня нету сервера. Все происходит на локальном компьютере.
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
gds32.dll таки лежит в system32?

Сам файл базы не RO? Кнопень "сервис" что скрывает? "Диалект" на 1-цу не пробовал ставить? К другой gdb не пробовал подключиться?


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Таки да - лежит именно в C:\windows\system32

Дата у файла 23.02.04


Файл базы не Read Only. Диалект 1 ставил. С другой базой gdb коннектиться пробовал. Результат тот же.

Насчет кнопеня "Сервис". На первый взгляд ничего особенного там в закладках нет. Но при выборе закладки users появляется вот такое сообщение об ошибке:

[attachment 26392 firebird3.jpg]

Возможно, в этом причина проблемы? И если причина в этом, то как это можно побороть?

Кстати, пробовал ставить имя хоста в маршруте к файлу gdb - ставил впереди слово hostel:d:\mydir\myfile.gdb

Но это тоже не помогло.
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Почитал в инете про такого рода ошибки.

Но неясно, в чем причина ошибки. Вообще-то у меня и FireBird проинсталлирован тоже. Но ведь и в Win XP все так же.

Посмотрел еще насчет активных служб. Вот что есть из служб по DSN и FireBird

[attachment 26393 firebird4.jpg]

Поверил - все службы, связанные c FireBird, запускаются: Firebird Guardian и Firebird Server

Нашел описание кода ошибок Firebird:

Цитата:
-904 335544792 service_att_err Cannot attach to services manager

www.firebirdsql.org
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Тем не менее, удалось добиться некоторого прогресса.

Вычитал, что (машинный перевод)

Цитата:
Еще одна проблема может быть, что локальная система связи не работают, как я помню, что Firebird 1.5 использует старую локальный протокол, который не работает на более новых версиях Windows. Этот протокол был заменен в Firebird 2.0 . Чтобы обойти , что вам нужно включить имя хоста в CREATE DATABASE или CONNECT заявление, так, например:

create database 'localhost:C:\test.fdb' user 'SYSDBA' password 'masterkey';

Написал в имени базы:

localhost:d:\mydir\myfile.gdb

При проверке соединения получил такое сообщение:

[attachment 26394 firebird5.jpg]


Спрашивается, и чего он отверг запрос на подключение? Его же не с Медстрахом пытаются соединить...
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
Simple777
Автор

Сообщений: 33855
Дата регистрации: 05.11.2006
Файл gdb был сформирован в Firebird 1.5 (сторонним приложением)
Ratings: 0 negative/0 positive
Re: Взять данные из файла *.gdb Firebird
PaulWist

Сообщений: 14625
Дата регистрации: 01.04.2004
www.ibase.ru


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 7 (Гостей: 7)

© 2000-2024 Fox Club 
Яндекс.Метрика