Есть ли способ (возможно, дешевый) получить доступ к Microsoft Sql Server из мейнфрейма z/OS (программы COBOL) и получить результат в эмуляции терминала 3270?
Я знаю, что 3270 — довольно старая система, но в банке CED , по-прежнему очень популярен.
Есть ли способ получить доступ к серверу Sql из мейнфрейма z/OS и получить результат в эмуляции терминала IBM 3270?
Ответы (8)
Это зависит от того, что вы на самом деле пытаетесь сделать. Насколько я понимаю ваш вопрос, вы хотите, чтобы процесс на основе мэйнфрейма обращался к базе данных SQL Server, а затем что-то делал с результатом, возможно, с использованием терминала 3270.
Если вы можете использовать системные службы Unix, вы можете скомпилировать библиотеку TDS, например FreeTDS, а затем использовать программу C для делай что хочешь с результатом. Если вы хотите усложнить задачу, вы можете запустить соединение из собственной среды z/OS, скомпилировав код с помощью IBM C, SAS C или Dignus C/C++. Я могу порекомендовать Dignus, и я использовал его для создания кода, взаимодействующего с другими языками в z/OS. Заголовки Dignus и библиотека времени выполнения имеют (по памяти) некоторую родословную FreeBSD, что помогает упростить перенос.
Используя этот подход, вы можете получить загрузочный модуль, который вы можете вызвать из какой-либо другой части вашей системы для выполнения работы, вы можете связать код с другими частями вашей системы или вы можете просто отправить задание и получить результат.
Если вы хотите использовать Java, вы можете использовать что-то вроде jTDS и написать код Java, чтобы делать то, что вам нужно. Я не использовал Java в z/OS, поэтому не могу дать конкретного совета, но я использовал jTDS на других платформах и остался доволен результатом.
Обновлять:
Вы можете экспортировать функцию C в качестве точки входа в загрузочный модуль, а затем вызывать ее из Cobol. Реализация C/C++ должна иметь дело со структурами данных Cobol; они хорошо определены и предсказуемы, так что это не проблема. В зависимости от того, насколько гибкими вам нужны вещи, вы можете скомпилировать запрос в код C и просто иметь функцию, которая выполняет предопределенный запрос и иметь интерфейс для получения результата, или вы можете иметь что-то более сложное, где запрос был предоставлен из программы Кобол.
Я использовал этот подход для предоставления функций API разработчикам Adabas/Natural, и он работал хорошо. Компилятор Dignus имеет механизм, с помощью которого вызывающие программы предоставляют дескриптор библиотеки времени выполнения, чтобы вы могли управлять временем существования среды выполнения C из вызывающей программы.
Для разработчика C/C++ это должно быть довольно просто. Если ваши разработчики все разработчики Cobol, все может быть немного сложнее.
Подход со шлюзом возможен, и я уверен, что есть шлюзовые продукты, но я не могу их рекомендовать. Я видел дрянные, которые не рекомендовал бы, но это не значит, что где-то нет хорошего.
Для полноты упомяну о возможности реализации протокола TDS в Cobol. Хотя звучит как жестокое и обычное наказание.
Если у вас есть эмуляция терминала 3270, какие терминалы вы используете? ПК?
Один интересный способ заключается в использовании маршрутизатора Cisco для преобразования на лету 3270 в обычный TCP, а затем написании простого прокси-сервера TCP для ваших процедур SQL Server.
Не как таковой - эмуляторы 3270 подключаются к мейнфрейму IBM. Чтобы получить данные из базы данных SQL-сервера на мэйнфрейме, вам нужно написать программу, работающую на мэйнфрейме, которая считывает данные из базы данных SQL-сервера. Для этого потребуется, чтобы на мейнфрейме работало программное обеспечение драйвера. Возможно, вы сможете найти третью сторону, которая делает такие вещи, но это, вероятно, будет довольно дорого.
Если вам нужно составить отчет или что-то, объединяющее данные из системы мейнфрейма с внешними источниками данных, может быть проще получить данные с мэйнфрейма и выполнить интеграцию в другом месте - возможно, в каком-то магазине данных.
Альтернативой может быть извлечение нужных данных из базы данных SQL Server и загрузка их на мэйнфрейм в виде плоского файла для обработки там.
Вот такая возможность, если вы пишете программы на языке COBOL, работающие в CICS.
Во-первых, оберните хранимую процедуру базы данных SQL Server оболочкой веб-службы. Посмотрите, например, статью 28577 на сайте devx.com.
После этого вызовите новую веб-службу, размещенную на SQL Server, с помощью вызова веб-службы CICS.
В последнем случае используйте стандартные команды CICS BMS для представления данных пользователю.
Разработка приложений для веб-служб CICS
Просто получите драйвер JDBC для доступа к серверу MS-SQL. Затем вы можете создать его подкласс и использовать в своей программе на Коболе, а также получить доступ к базе данных так же, как если бы вы использовали ее из Java.
Получив результаты, вы можете представить их с помощью обычных функций BMS.
Никаких грязных хаков или причудливых сетевых трюков не требуется. С IBM Enterprise Cobol вы действительно можете просто создать класс Java и использовать его так же, как в пространстве Java.
Возможно, вы сможете сделать то, что я делал в прошлом. Я написал программы/функции DB2 для MS-SQL COBOL, которые делают таблицу/представление MS-SQL SELECT только для DB2. Это включало создание работающей службы на сетевом сервере, которая принимала бы TCP/IP-соединения только от мейнфрейма и использовала учетные данные, переданные в качестве идентификатора пользователя/пароля, используемые для доступа к таблице MS-SQL. Затем он выполнит выборку таблицы/представления и сначала передаст список имен полей с общим количеством строк. Затем он будет передавать каждую строку как поля с разделителями табуляции обратно в мейнфрейм. Программа COBOL сохранит имена полей в таблице, которая будет использоваться для определения того, какую процедуру следует использовать для преобразования каждого поля MS-SQL в DB2. С точки зрения DB2 это выглядит как функция, возвращающая поля. У нас работает около 30 штук. Мне пришлось создать процедуру описания MS-SQL, чтобы помочь создать начальные определения транзакций полей для программы COBOL. Также пришлось создать программу COBOL для чтения данных описания и создания команд связывания и разделения процедур. Одна программа COBOL для каждой таблицы/представления MS-SQL. Вот пример определения функции. CREATE FUNCTION
TCL.BALANCING_RECON(VARCHAR(4000))
RETURNS
TABLE(
SCOMPANY CHAR(6),
PNOTENO VARCHAR(14),
PUNIT CHAR(3),
LATEFEES DEC(11,2),
FASB_4110 DEC(11,2),
FASB_4111 DEC(11,2),
USERAMOUNT1 DEC(11,2),
USERAMOUNT2 DEC( 11,2),
USERFIELD1 VARCHAR(14)
)
ЯЗЫК COBOL
ПРОДОЛЖИТЬ ПОСЛЕ ОШИБКИ
НЕ ДЕТЕРМИНИСТИЧЕСКИЙ
ЧИТАЕТ ДАННЫЕ SQL
ВНЕШНЕЕ ИМЯ DB2TCL02
COLLID DB2TCL02
СТИЛЬ ПАРАМЕТРА SQL
ВЫЗЫВАЕТСЯ ПРИ НУЛЕВОМ ВВОДЕ
НЕТ ВНЕШНИХ ДЕЙСТВИЙ
ЗАПРЕТИТЬ ПАРАЛЛЕЛЬНЫЙ
SCRATCHPAD 8000
ОГРАНИЧЕНИЕ ВРЕМЕНИ ASU 100
ОСТАВАТЬСЯ РЕЗИДЕНТНЫМ ДА
ТИП ПРОГРАММЫ SUB
СРЕДА WLM DB2TWLM
БЕЗОПАСНОСТЬ DB2
DBINFO
; COMMIT;
GRANT EXECUTE ON FUNCTION TCL.BALANCING_RECON TO PUBLIC;
Для вызова функции: SELECT * FROM
TABLE (TCL.BALANCING_RECON(''
)) AS X;
Вы бы поместили любые команды фильтра MS-SQL между кавычками.
Меня не просили обновить какие-либо данные MS-SQL, поэтому я еще не преодолел это препятствие. В DB2 также есть база данных, которая отслеживает идентификатор/пароль и сервер, на котором выполняется запущенная задача. Это так, если сервер перегружен, разные выборки могут быть отправлены на разные серверы. Ответ быстрый, даже для больших таблиц. Тайм-аут такой же, как тайм-аут взаимоблокировки 60. Транспорт в основном основан на IP. DB2 просто видит данные как ссылку на внешнюю таблицу.
Что касается грязных взломов, не думали ли вы о создании простого HTTP- или TCP-сервера, который возвращает .csv нужных вам табличных данных?
Это означает, что вашему клиенту для доступа к данным нужен только простой HTTP/TCP-клиент, а не клиентская библиотека базы данных.
В моей компании мы используем Java для подключения к серверу Sql.
И CL вызывает эту Java-программу :)
Очень простой...