有没有办法从 z/OS 大型机访问 Sql 服务器并在 IBM 3270 终端仿真中得到结果?
Posted
技术标签:
【中文标题】有没有办法从 z/OS 大型机访问 Sql 服务器并在 IBM 3270 终端仿真中得到结果?【英文标题】:Is there some way to access Sql server from z/OS mainframe and have the result in IBM 3270 terminal emulation? 【发布时间】:2010-02-08 07:56:25 【问题描述】:是否有任何方法(可能便宜)从 z/OS 大型机(COBOL 程序)访问 Microsoft Sql Server 并在 3270 终端仿真中获得结果? 我知道 3270 是一个相当老的系统,但在银行 CED 中,仍然很受欢迎。
【问题讨论】:
【参考方案1】:这取决于您实际尝试做什么。我对您的问题的解读是,您希望基于大型机的进程访问 SQL Server 数据库,然后对结果进行处理,可能涉及 3270 终端。
如果你可以使用 Unix 系统服务,你可以编译一个像 FreeTDS 这样的 TDS 库,然后使用 C 程序对结果做你想做的事。如果您想变得更复杂,您可以通过使用 IBM C、SAS C 或Dignus C/C++ 编译代码,从本机 z/OS 环境运行连接。我可以推荐 Dignus,我已经使用它来构建与 z/OS 上的其他语言交互的代码。 Dignus 头文件和运行时库(从内存中)有一些有助于简化移植的 FreeBSD 血统。
使用这种方法,您可以获得一个加载模块,您可以从系统的其他部分调用该模块来完成工作,您可以将代码与系统的其他部分链接,或者您可以提交一个作业并获取输出。
如果你想使用 Java,你可以使用 jTDS 之类的东西并编写 Java 代码来做你需要的事情。我没有在 z/OS 上使用过 Java,所以我不能在那里提供具体的建议,但我在其他平台上使用过 jTDS,我对结果很满意。
更新:
您可以将 C 函数导出为加载模块的入口点,然后从 Cobol 调用它。 C/C++实现需要处理Cobol数据结构;它们定义明确且可预测,因此这不是问题。根据您需要的灵活性,您可以将查询编译到 C 代码中,并且只使用一个执行预定义查询并具有用于检索结果的接口的函数,或者您可以在提供查询的地方使用更复杂的东西来自 Cobol 程序。
我已经使用这种方法向 Adabas/Natural 开发人员提供 API 功能,并且效果很好。 Dignus 编译器有一种机制,调用者可以提供运行时库的句柄,以便您可以从调用程序管理 C 运行时环境的生命周期。
对于 C/C++ 开发人员来说,这应该相当简单。如果您的开发人员都是 Cobol 开发人员,事情可能会有点棘手。
网关方法是可能的,我确信周围有网关产品,但我不能推荐一种。我见过我不推荐的蹩脚的,但这并不意味着某处没有好的。
为了完整起见,我将提到在 Cobol 中实现 TDS 协议的可能性。不过,这听起来像是残酷而平常的惩罚。
【讨论】:
感谢您的回答。我稍微修改了这个问题,因为程序需要用 Cobol 编码。对不起,如果我认为 Cobol 语言是理所当然的。 没问题。您可以毫无问题地从 Cobol 调用 C/C++;调用约定在 z/O 上得到了很好的定义。 好的答案和便宜的解决方案;不幸的是,我们没有 C\C++ 开发人员。【参考方案2】:如果您有 3270 终端仿真,您使用的是什么终端?电脑?
一个有趣的 hack 是使用 Cisco 路由器即时执行 3270 到 vanilla TCP 的转换,然后为您的 SQL Server 程序编写一个简单的 TCP 代理
【讨论】:
您好 TFD 是的,我们使用的是 PC。这种破解在银行生产环境中可行吗?不用说与 db2 的连接必须继续工作:)。 YMMV 但据我所知,它已被一家大型商业银行用于生产至少一次。如果您有 PC,为什么不让他们直接访问 SQL? 正确的场景是“大型机同时连接db2\sql并为客户端集成数据”。 是的,但这不是你问的问题。大型机可以通过多种方式访问 SQL Server,例如简单的 CICS 到 OLEDB 适配器 一些银行正在使用事务交换机将一些事务从大型机迁移到 PC 服务器集群。这只是 Cisco hack 的高级形式【参考方案3】:并非如此 - 3270 仿真器正在连接到 IBM 大型机。为了从大型机上的 SQL 服务器数据库中获取数据,您必须编写一个在大型机上运行的程序,该程序从 SQL 服务器数据库中读取数据。这将要求您在大型机上运行驱动程序软件。你也许可以找到制造这种东西的第三方,但它可能非常昂贵。
如果您需要将来自大型机系统的数据与外部数据源相结合的报告或其他东西放在一起,则可能更容易从大型机中获取数据并在其他地方进行集成 - 也许是某种数据集市。
另一种方法是从 SQL Server 数据库中提取您想要的数据并将其作为平面文件上传到大型机以便在那里进行处理。
【讨论】:
谢谢,我们通常做的是在 db2 上复制 sql server 表,使它们通过夜间批处理作业保持同步……或者如您所说,从 sql 和 db2 中提取数据并在其他地方处理集成。我只是好奇是否有某种方法可以避免这些技术。【参考方案4】:如果您正在编写在 CICS 中运行的 COBOL 程序,这是一种可能。
首先,使用 Web 服务包装器包装您的 SQL Server 数据库存储过程。以 devx.com 文章 28577 为例。
之后,使用 CICS Web 服务调用来调用新的 SQL Server 托管 Web 服务。
最后使用标准 CICS BMS 命令将数据呈现给用户。
Appliation Development for CICS Web Services
【讨论】:
【参考方案5】:只需获取 JDBC 驱动程序即可访问 MS-SQL 服务器。然后,您可以对其进行子类化并在您的 Cobol 程序中使用它并访问数据库,就像您在 Java 中使用它一样。
获得结果后,您可以通过常规 BMS 功能进行展示。
不需要肮脏的黑客或花哨的网络技巧。使用 IBM Enterprise Cobol,您真的可以创建一个 Java 类并像在 Java 空间中一样使用它。
【讨论】:
我们使用 JZOS Java 做了同样的事情“JDBC 驱动程序访问 MS-SQL 服务器”。不需要 COBOL。【参考方案6】:你也许可以做一些我过去做过的事情。我已将 DB2 写入 MS-SQL COBOL 程序/函数,这些程序/函数使 MS-SQL 表/视图仅选择 DB2。它涉及在网络服务器上创建一个正在运行的服务,该服务将只接受来自大型机的 TCP/IP 连接,并使用作为用户 ID/PW 传递的凭据来访问 MS-SQL 表。然后它会针对表/视图发出选择,并首先将字段名称列表与总行数一起传回。然后它将每一行作为制表符分隔的字段传递回大型机。 COBOL 程序会将字段名称保存在一个表中,用于确定使用哪个例程将每个 MS-SQL 字段转换为 DB2。从 DB2 的角度来看,它看起来像一个返回字段的函数。我们有大约 30 个正在运行。我必须创建一个 MS-SQL 描述过程来帮助创建 COBOL 程序的字段转换的初始定义。还必须创建一个 COBOL 程序来读取描述数据并创建链接和程序划分命令。每个 MS-SQL 表/视图一个 COBOL 程序。 这是一个示例函数定义。 创建函数 TCL.BALANCING_RECON(VARCHAR(4000)) 退货 表( SCOMPANY CHAR(6), PNOTENO VARCHAR(14), PUNIT CHAR(3), 迟到的费用 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 碰撞 DB2TCL02 参数样式 SQL 空输入时调用 没有外部行动 禁止并行 暂存器 8000 ASUTIME LIMIT 100 继续居住是的 节目类型子 WLM 环境 DB2TWLM 安全 DB2 数据库信息 ;提交; 将函数 TCL.BALANCING_RECON 授予 PUBLIC 执行;
调用函数: 选择 * 来自 表(TCL.BALANCING_RECON('' )) 作为 X;
您可以将任何 MS-SQL 过滤命令放在引号之间。
我没有被要求更新任何 MS-SQL 数据,所以我还没有跳过这个障碍。 DB2 中还有一个数据库,用于跟踪 ID/PW 和运行已启动任务的服务器。如果服务器过载,则可以将不同的选择推送到不同的服务器。响应速度很快,即使对于大桌子也是如此。超时与 60 死锁超时相同。传输主要基于 IP。 DB2 只是将数据视为外部表引用。
【讨论】:
【参考方案7】:作为肮脏的黑客,您是否考虑过创建一个简单的 HTTP 或 TCP 服务器来返回您需要的表数据的 .csv 格式?
这意味着您的客户端只需要一个简单的 HTTP/TCP 客户端即可访问数据,而不是数据库客户端库。
【讨论】:
【参考方案8】:在我公司,我们使用 Java 连接到 Sql Server。
一个 CL 调用这个 Java 程序 :)
很简单...
【讨论】:
以上是关于有没有办法从 z/OS 大型机访问 Sql 服务器并在 IBM 3270 终端仿真中得到结果?的主要内容,如果未能解决你的问题,请参考以下文章
C# - 在没有许可证的情况下连接到 DB2 z/os 大型机