Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Интеграция Firebird и MSSQL Server / 25 сообщений из 55, страница 1 из 3
12.01.2017, 09:49
    #39382894
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Здравствуйте.
В ходе работы на проектом возникла следующая задача. В процессе выполнения хранимой процедуры в БД Firebird 2.5 x64 необходимо следующее.
1. Выполнить хранимую процедуру в БД MSSQL Server 2008 и возвращаемый ей набор данных положить во временную таблицу Firebird либо в MemoryDataset (этот вариант предпочтительнее с точки зрения быстродействия). Эти данные должны быть доступны только внутри этого вызова хранимой процедуры Firebird и после завершения занимаемая им память должна быть освобождена.
2. В случае MemoryDataset произвести один или несколько проходов по этому датасету для формирования итогового набора данных и его возврата (suspend) в клиентское приложение.

Вариант с подключением к MSSQL через компоненты FireDAC или ADO отпадает так как стоит сверх-задача сделать получение данных из MSSQL прозрачным с точки зрения клиентского приложения, которое "заточено" на работу с Firebird.

Прошу поделиться мнениями, идеями и ссылками. Ответ "не возможно" не принимается. Позади Сибирь. http://www.sql.ru/forum/images/biggrin.gif
...
Рейтинг: 0 / 0
12.01.2017, 10:00
    #39382908
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Очередное "как бы постирать бельишко, но только без мыла и порошка"

Пиши костыль, который перед обращением к Firebird будет выполнять предварительную функцию заливки туда данных.
...
Рейтинг: 0 / 0
12.01.2017, 10:03
    #39382912
Товарищ старший сержант
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
udr?
...
Рейтинг: 0 / 0
12.01.2017, 10:05
    #39382915
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Товарищ старший сержант,
Разрешите доложить. я знаю только UDF.
Что есть UDR и где по него грамотно написано?
...
Рейтинг: 0 / 0
12.01.2017, 10:10
    #39382919
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
po-stroyka,

Не обращай внимания, он не читатель. Вторую строку до конца не осилил.
...
Рейтинг: 0 / 0
12.01.2017, 10:13
    #39382922
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Навскидку

1. 3 UDF:
- DBConnectAndExecQuery(Addr): QueryPtr
- QueryGetRowAndNext(QueryPtr): Field1, ..., FieldN
- CloseQueryAndDB(QueryPtr)

Из QueryGetRowAndNext запихиваем во временную таблицу, там крутим, выдаем клиенту, очищаем.
Минусы - фиксированный набор полей в UDF, что означает пересборку при изменении. Либо придется мутить с упаковкой-распаковкой, что на SQL не очень приятная задача.

2. Приложение-посредник и 1 UDF.
UDF при вызове дергает приложение (через пайпы, сокеты и т.п.), приложение перекачивает данные, ХП их обрабатывает.
Но:
- ХП должна как-то подождать, пока приложение перекачает данные (можно обеспечить внутри UDF)
- ХП должна увидеть данные внутри уже начатой транзакции (достигается параметрами транзакции)
- Клиент должен быть строго один; либо записывать данные в таблицу вместе с ИД клиента.

3. Элементарно репликация в FB.
Минусы - возможно будет много лишних операций. Зато наиболее надежно.

4. (возможно, если UDR подерживает передачу текущего соединения) Переход на ФБ 3 и закачка данных из UDR непосредственно во временную таблицу (вариант №1, но более краткий и устойчивый).
...
Рейтинг: 0 / 0
12.01.2017, 10:15
    #39382925
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
WildSeryВторую строку до конца не осилил.
Во второй строке не описана ситуация с временной таблицей.

Вообще не понятно, что ТС имеет в виду под memorydataset.
...
Рейтинг: 0 / 0
12.01.2017, 10:16
    #39382926
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
wadmanВо второй строке не описана ситуация с временной таблицей.
Прошу прощения, я спутал вторую строку со вторым пунктом.
...
Рейтинг: 0 / 0
12.01.2017, 10:16
    #39382927
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
WildSery,
все необходимые данные и так уже находятся в БД MSSQL и меняются там в реальном времени.
собственно по этому и весь этот сыр бор.
в таком ключе не понимаю что вы подразумеваете под костылем? утилите по заливке изменений из MSSQL в Firebird?
...
Рейтинг: 0 / 0
12.01.2017, 10:21
    #39382930
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
В принципе, вариант №1 можно ужать до одной универсальной UDF. Если указатель на запрос в параметре пуст, она коннектится к базе и создает объект. Когда же данные полностью прочитаны, можно сразу удалять объект и разрывать соединение.
...
Рейтинг: 0 / 0
12.01.2017, 10:29
    #39382934
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Василий №2Навскидку

1. 3 UDF:
- DBConnectAndExecQuery(Addr): QueryPtr
- QueryGetRowAndNext(QueryPtr): Field1, ..., FieldN
- CloseQueryAndDB(QueryPtr)

Из QueryGetRowAndNext запихиваем во временную таблицу, там крутим, выдаем клиенту, очищаем.
Минусы - фиксированный набор полей в UDF, что означает пересборку при изменении. Либо придется мутить с упаковкой-распаковкой, что на SQL не очень приятная задача.

2. Приложение-посредник и 1 UDF.
UDF при вызове дергает приложение (через пайпы, сокеты и т.п.), приложение перекачивает данные, ХП их обрабатывает.
Но:
- ХП должна как-то подождать, пока приложение перекачает данные (можно обеспечить внутри UDF)
- ХП должна увидеть данные внутри уже начатой транзакции (достигается параметрами транзакции)
- Клиент должен быть строго один; либо записывать данные в таблицу вместе с ИД клиента.

3. Элементарно репликация в FB.
Минусы - возможно будет много лишних операций. Зато наиболее надежно.

4. (возможно, если UDR подерживает передачу текущего соединения) Переход на ФБ 3 и закачка данных из UDR непосредственно во временную таблицу (вариант №1, но более краткий и устойчивый).

Спасибо
Вот первый вариант мне более всего нравится исходя из того что данные в БД MSSQL меняются в реальном времени.
Есть несколько вопросов.
1. Что есть параметры Addr и QueryPtr?
2. При написании UDF в Delphi 2010 имеем 32-битную DLL. Заведется ли на Firebird 2.5 x64?
3. А если так QueryGetIntValue(QueryPtr, 'FieldName'), QueryGetStringValue(QueryPtr, 'FieldName') и т. д? Естественно с предварительно проверкой на тип данных в поле. Ведь типов данных ограниченное количество в отличие от количества полей.
...
Рейтинг: 0 / 0
12.01.2017, 10:34
    #39382938
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
po-stroykaВот первый вариант мне более всего нравится исходя из того что данные в БД MSSQL меняются в реальном времени.
Mssql умеет работать с другими субд, вот в нем и можно это всё провернуть.

Или результат этой катавасии не должен оставлять каких-либо следов от слова "совсем"?
...
Рейтинг: 0 / 0
12.01.2017, 10:53
    #39382961
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
po-stroykaЕсть несколько вопросов.
1. Что есть параметры Addr и QueryPtr?
2. При написании UDF в Delphi 2010 имеем 32-битную DLL. Заведется ли на Firebird 2.5 x64?
3. А если так QueryGetIntValue(QueryPtr, 'FieldName'), QueryGetStringValue(QueryPtr, 'FieldName') и т. д? Естественно с предварительно проверкой на тип данных в поле. Ведь типов данных ограниченное количество в отличие от количества полей.
1. Addr - строка подключения к MSSQL, можно также встроить в DLL либо читать DLL-ю из конфига, не принципиально. QueryPtr - указатель на созданный внутри DLL объект запроса. Можно и глобальной переменной внутри DLL сделать, но это менее устойчиво (разве что объявить как threadvar).
2. Конечно нет, разрядность должна совпадать. Либо брать Дельфи поновее, либо Lazarus, либо другие языки.
3. Как вариант, хотя тогда количество UDF будет больше, плюс весь процесс замедлится (правда, не так уж сильно). Зато более универсально, да.

Если MSSQL умеет взаимодействовать с FB, то еще вариант - UDF дергает MSSQL, тот заливает данные в FB с ИД текущего FB-подключения, ХП в FB дальше с ними работает. Транзакция клиента в FB при этом д.б. read_committed.
...
Рейтинг: 0 / 0
12.01.2017, 11:19
    #39382974
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Василий №2po-stroykaЕсть несколько вопросов.
1. Что есть параметры Addr и QueryPtr?
2. При написании UDF в Delphi 2010 имеем 32-битную DLL. Заведется ли на Firebird 2.5 x64?
3. А если так QueryGetIntValue(QueryPtr, 'FieldName'), QueryGetStringValue(QueryPtr, 'FieldName') и т. д? Естественно с предварительно проверкой на тип данных в поле. Ведь типов данных ограниченное количество в отличие от количества полей.
1. Addr - строка подключения к MSSQL, можно также встроить в DLL либо читать DLL-ю из конфига, не принципиально. QueryPtr - указатель на созданный внутри DLL объект запроса. Можно и глобальной переменной внутри DLL сделать, но это менее устойчиво (разве что объявить как threadvar).
2. Конечно нет, разрядность должна совпадать. Либо брать Дельфи поновее, либо Lazarus, либо другие языки.
3. Как вариант, хотя тогда количество UDF будет больше, плюс весь процесс замедлится (правда, не так уж сильно). Зато более универсально, да.

Если MSSQL умеет взаимодействовать с FB, то еще вариант - UDF дергает MSSQL, тот заливает данные в FB с ИД текущего FB-подключения, ХП в FB дальше с ними работает. Транзакция клиента в FB при этом д.б. read_committed.

Огромное спасибо.
Сам думал про что то подобное. Благодаря Вам многое встало на нужные полочки.
Готовой DLL-кой поделюсь.
>>> 2. Конечно нет, разрядность должна совпадать. Либо брать Дельфи поновее, либо Lazarus, либо другие языки.
Дельфи поновее надо будет опять покупать. Возможно придется откатиться на Firebird x32. Или откатка не поможет?
...
Рейтинг: 0 / 0
12.01.2017, 11:25
    #39382979
Filippov Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
po-stroyka,
а там без процедуры никак?
Если бы переписать ее во VIEW, то там бы Linked Sever -а бы хватило.
С минимальным уровнем шаманств.
...
Рейтинг: 0 / 0
12.01.2017, 11:30
    #39382985
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Filippov Dmitrypo-stroyka,
а там без процедуры никак?
Если бы переписать ее во VIEW, то там бы Linked Sever -а бы хватило.
С минимальным уровнем шаманств.

Насколько я понимаю Linked Sever - это для подключения из MSSQL к Firebird-у. А мне нужно наоборот и чтобы сама хранимая процедура Firebird инициировала подключение и получала данные из MSSQL.
...
Рейтинг: 0 / 0
12.01.2017, 11:40
    #39382989
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
po-stroyka,

по уму надо переходить на FB 3 и писать UDR процедуру.
А передача указателей через UDF это полный изврат
...
Рейтинг: 0 / 0
12.01.2017, 11:45
    #39382993
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Симонов Денисpo-stroyka,

по уму надо переходить на FB 3 и писать UDR процедуру.
А передача указателей через UDF это полный изврат

1. Backup на v2.5 и restore v3 БД нужно?
2. Для UDR имеет значение разрядность x86/x64?
3. Можно ссылочку чтобы было грамотно написано про написание UDR?
...
Рейтинг: 0 / 0
12.01.2017, 12:06
    #39383007
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
по теме:
постановка задачи - говно.
советы как её решить через жопу, тоже.

ТС, пересмотри задачу, чтобы для её решения
не приходилось изменять всемирный закон тяготения.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.01.2017, 12:15
    #39383017
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
po-stroyka,

1. Backup на v2.5 и restore v3 БД нужно? - да (возможно придётся подкручивать)
2. Для UDR имеет значение разрядность x86/x64? - да, если только udr не написана на Java
3. Можно ссылочку чтобы было грамотно написано про написание UDR?
нет пока никаких ссылок. Есть пример простейшей UDR на Delphi https://github.com/asfernandes/fbstuff/tree/master/src
...
Рейтинг: 0 / 0
12.01.2017, 12:44
    #39383054
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Мимопроходящийпо теме:
постановка задачи - говно.
советы как её решить через жопу, тоже.

ТС, пересмотри задачу, чтобы для её решения
не приходилось изменять всемирный закон тяготения.



Благодарю Вас за мнение. Будете еще раз проходить мимо, проходите.
...
Рейтинг: 0 / 0
12.01.2017, 12:45
    #39383055
po-stroyka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Симонов Денисpo-stroyka,

1. Backup на v2.5 и restore v3 БД нужно? - да (возможно придётся подкручивать)
2. Для UDR имеет значение разрядность x86/x64? - да, если только udr не написана на Java
3. Можно ссылочку чтобы было грамотно написано про написание UDR?
нет пока никаких ссылок. Есть пример простейшей UDR на Delphi https://github.com/asfernandes/fbstuff/tree/master/src

Благодарю Вас за ценные советы. Будете проходить мимо, заходите на огонек :-)
...
Рейтинг: 0 / 0
12.01.2017, 12:45
    #39383056
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Мимопроходящийпостановка задачи - говно.
советы как её решить через жопу, тоже.+1

Вариант "все данные в базе ФБ" не рассматривается? актуальность поддерживать репликатором.
...
Рейтинг: 0 / 0
12.01.2017, 13:10
    #39383084
Василий №2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
po-stroykaОгромное спасибо.
Сам думал про что то подобное. Благодаря Вам многое встало на нужные полочки.
Готовой DLL-кой поделюсь.
>>> 2. Конечно нет, разрядность должна совпадать. Либо брать Дельфи поновее, либо Lazarus, либо другие языки.
Дельфи поновее надо будет опять покупать. Возможно придется откатиться на Firebird x32. Или откатка не поможет?
Пожалуйста).
Поскольку кода будет всего ничего, то можно заюзать Lazarus даже без особого вникания. Сервер всё-таки лучше иметь 64-битный.
Симонов ДенисА передача указателей через UDF это полный изврат
Никакого изврата. Можно считать его "хэндлом объекта запроса". Для FB это будет черный ящик, нужный только в DLL для обеспечения многопоточного использования.
Кстати, ТС, про IsMultithread в DLL не забудь.
Ivan_PisarevskyВариант "все данные в базе ФБ" не рассматривается? актуальность поддерживать репликатором.
Предложил это, но судя по описанию, исходная БД интенсивно изменяется. Репликация, имхо, повлечет введение дополнительного инструмента и большую ненужную в данном применении нагрузку.
...
Рейтинг: 0 / 0
12.01.2017, 13:17
    #39383100
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интеграция Firebird и MSSQL Server
Ivan_PisarevskyВариант "все данные в базе ФБ" не рассматривается?

Ну, у них же там "данные в MS SQL меняются в реальном времени". Очевидно, что это делается
приложением ТСа, который смог заставить его работать только с MS SQL.

Почему нельзя переточить "приложение заточенное на Firebird" под MS SQL - непонятно,
вероятно, оно купленное без исходников.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Интеграция Firebird и MSSQL Server / 25 сообщений из 55, страница 1 из 3
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]