是否有任何方法(可能便宜)从 z/OS 大型机(COBOL 程序)访问 Microsoft Sql Server 并在 3270 终端仿真中获得结果?
我知道 3270 是一个相当古老的系统,但在银行 CED 中仍然很受欢迎。
8 回答
如果您有 3270 终端仿真,您使用的是什么终端?件?
一个有趣的 hack 是使用 Cisco 路由器即时执行 3270 到 vanilla TCP 的转换,然后为 SQL Server 程序编写一个简单的 TCP 代理
这取决于您实际尝试做什么。我对您的问题的解读是,您希望基于大型机的进程访问 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 协议的可能性。不过,这听起来像是残酷而平常的惩罚。
不是这样 - 3270 仿真器正在连接到 IBM 大型机。为了从大型机上的 SQL 服务器数据库中获取数据,您必须编写一个在大型机上运行的程序,该程序从 SQL 服务器数据库中读取数据。这将要求您在大型机上运行驱动程序软件。你也许可以找到制造这种东西的第三方,但它可能非常昂贵。
如果您需要将来自大型机系统的数据与外部数据源相结合的报告或其他东西放在一起,则可能更容易从大型机中获取数据并在其他地方进行集成 - 也许是某种数据集市。
另一种方法是从 SQL Server 数据库中提取您想要的数据并将其作为平面文件上传到大型机以便在那里进行处理。
如果您正在编写在 CICS 中运行的 COBOL 程序,这是一种可能。
首先,使用 Web 服务包装器包装您的 SQL Server 数据库存储过程。以 devx.com 文章 28577 为例。
之后,使用 CICS Web 服务调用来调用新的 SQL Server 托管 Web 服务。
最后使用标准 CICS BMS 命令将数据呈现给用户。
只需获取 JDBC 驱动程序即可访问 MS-SQL 服务器。然后,您可以将其子类化并在您的 Cobol 程序中使用它并访问数据库,就像您在 Java 中使用它一样。
获得结果后,您可以通过常规 BMS 功能呈现它们。
不需要肮脏的黑客或花哨的网络技巧。使用 IBM Enterprise Cobol,您真的可以只创建一个 Java 类并像在 Java 空间中一样使用它。
你也许可以做一些我过去做过的事情。我已将 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),
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
冲突 DB2TCL02
参数
样式 SQL调用
空输入
无外部操作禁止
并行
暂存器 8000
ASUTIME LIMIT 100
STAY RESIDENT YES
程序类型 SUB
WLM 环境 DB2TWLM
安全 DB2
DBINFO
; 犯罪;
将函数 TCL.BALANCING_RECON 授予 PUBLIC 执行;
调用函数: SELECT * FROM
TABLE (TCL.BALANCING_RECON(''
)) AS X;
您可以将任何 MS-SQL 过滤器命令放在引号之间。
我没有被要求更新任何 MS-SQL 数据,所以我还没有跳过这个障碍。DB2 中还有一个数据库,用于跟踪 ID/PW 和运行已启动任务的服务器。如果服务器过载,则可以将不同的选择推送到不同的服务器。响应速度很快,即使对于大桌子也是如此。超时与 60 死锁超时相同。传输主要基于 IP。DB2 只是将数据视为外部表引用。
作为肮脏的黑客,您是否考虑过创建一个简单的 HTTP 或 TCP 服务器来返回您需要的表数据的 .csv 文件?
这意味着您的客户端只需要一个简单的 HTTP/TCP 客户端即可访问数据,而不需要数据库客户端库。
在我的公司,我们使用 Java 连接到 Sql Server。
一个 CL 调用这个 Java 程序 :)
非常简单...