使用 DRDA 服务时,可能会遇到这些常见问题。
无法将 DRDA 服务作为控制台应用程序启动
如果无法将 DRDA 服务作为控制台应用程序启动,检查查看 DRDA 服务是否已作为服务运行。
在“开始”菜单上,依次指向“所有程序”、“Microsoft Visual Studio 2010”、“Visual Studio Tools”,右键单击“Visual Studio x64 Win64 命令提示符 (2010) ”,然后单击“以管理员身份运行”。 将显示“ 用户帐户控制 ”对话框。 单击 “是” 继续操作。
在命令提示符下,输入 net stop msdrdaservice ,然后按 Enter。
C:\Windows\system32>net stop msdrdaservice The Microsoft Service for DRDA service is stopping. The Microsoft Service for DRDA service was stopped successfully.
自定义侦听器
在服务启动时,DRDA 服务会将警告条目写入内部 DrdaAsTextListener 和 DrdaAsConsoleListener,通知 IT 专业人员 DRDA 服务无法加载自定义侦听器 (绑定、文本和其他) 。
自定义绑定侦听器
DRDA 服务支持自定义绑定侦听器,这可能支持 DB2 XML 文档格式的两种静态 SQL 之一:HIS 2010 (v8.5) 或 HIS 2013 (v9.0) 。 在从自定义绑定侦听器回调时,DRDA 服务可能会记录此错误。
Error:2:2:[sep 13 2012 10:44:09.571] SqlDatabase::CreateXMLForPackage::OnPackageBound(xmlstring ... out sqlscripts) no sql scripts are passed back.
Error:2:2:[sep 13 2012 10:44:09.573] SqlDatabase::CreateXMLForPackage::OnPackageBound(xmlstring, ..., out sqlscripts) Null and empty scripts passed from custom binder
Error:2:4:[sep 13 2012 10:44:09.575] SqlDatabase::CreateXMLForPackage::OnPackageBound(xmlstring, ..., out sqlscripts) at Microsoft.HostIntegration.Drda.RDB.SqlDatabase.CreateXMLForPackage
解决方案是配置相应的 packageXmlFormat 属性值。 packageXmlFormat 属性指示 DRDA 服务器以 v90 或 v85 格式编写 DB2 XML 静态 SQL 文件。 此可选属性接受 v85 或 v90 的字符串值。 默认值为 v90 。
在这种情况下,应尝试指定值“v85”,然后重新请求绑定或绑定复制命令。
packageXmlFormat=“v85”
静态 SQL for DB2 包 XML 格式属性。
注意
Microsoft HIS 2013 (V9) 支持新旧格式,其中包括用于验证 XML 文档的关联 XML 架构。 Microsoft HIS 2009 和 HIS 2010 (V8.5) 仅支持旧格式。
Microsoft Client for DB2 测试连接失败的问题
Could not connect to data source 'DATASOURCE':
An internal network library error has occurred. A network level syntax error has occurred.
解决方案是验证企业单一登录的 DRDA 服务配置。
首先,检查配置了适用于 Host-Initiated SSO 的企业单一 Sign-On,然后按照“配置 HIS 2010 和 ESSO V4.5”部分中的步骤 6 和 7 重新启动 EntSSO 服务。
其次,检查按照标题为“为 Windows 发起的 SSO 定义 ESSO 关联应用程序”部分中的步骤 11-13 正确映射主机和 Windows 凭据。 此外,在测试连接时,请验证是否使用 Microsoft Client for DB2 中正确的主机凭据。
IBM QMF for z/OS 因位置名称未知而失败的问题错误
IBM QMF for z/OS 连接失败 (例如 SELECT * FROM HISDEMO1。Dbo。客户) 将返回以下错误。
The ___location name is not known to the local DB2 subsystem.
解决方案是验证 DB2 for z/OS 配置数据库,并根据需要重新启动 DDF。
首先,验证是否 (SYSIBM 更新了 DB2 for z/OS 目录表。LOCATIONS,SYSIBM。IPNAMES 和 SYSIBM。用户名) 远程关系数据库。
其次,请让 DB2 for z/OS 管理员停止并重新启动 DB2 for z/OS 分布式数据设施 (DDF) (DRDA 协议网关),然后重新尝试 SQL 查询。
IBM QMF for z/OS 失败并出现资源不可用错误的问题
IBM QMF for z/OS 连接失败 (例如 SELECT * FROM HISDEMO1。Dbo。客户) 将返回以下错误。
Unsuccessful execution caused by an unavailable resource. (Reason code:
00D300F4; type of resource: 00001005; and resource name: NAME).
The DRDA AS log will have the following corresponding error.
Could not map use rid/password to a valid windows account. Authentication failed.
解决方案是验证 DB2 for z/OS 配置数据库,并根据需要重新启动 DDF。
首先,验证是否 (SYSIBM 更新了 DB2 for z/OS 目录表。LOCATIONS,SYSIBM。IPNAMES 和 SYSIBM。用户名) 远程关系数据库。
其次,请让 DB2 for z/OS 管理员停止并重新启动 DB2 for z/OS 分布式数据设施 (DDF) (DRDA 协议网关),然后重新尝试 SQL 查询。
IBM QMF for z/OS 失败并出现语法错误或访问规则冲突的问题
IBM QMF for z/OS、SPUFI、DB2 管理员 或其他程序无法查询 DB2 for z/OS 别名 (例如 DBO。REMAREAS) SQL Server表 (例如HISDRDA1。Dbo。AREAS) ,使用 DRDA AS 返回以下错误。
DSNT408I SQLCODE = -204, SQLSTATE = 42704, SYNTAX ERROR OR ACCESS RULE VIOLATION FROM DB2 UDB for AIX, Linux, HP-UX, Sun, and Windows TOKENS 'DBO.REMAREAS' IS AN UNDEFINED NAME.
DRDA AS 日志将具有以下相应的错误。
DrdaAs Information: 7 : [9/19/2011 4:30:55 PM] Processing PRPSQLSTT "SELECT * FROM DBO.REMAREAS"
DrdaAs Error: 7 : [9/19/2011 4:30:55 PM] Message: Invalid object name 'DBO.REMAREAS'.
解决方法是验证是否创建了相应的SQL Server ALIAS 或 VIEW。
例如:
CREATE VIEW [dbo].[REMAREAS]
AS
SELECT dbo.AREAS.*
FROM dbo.AREAS
IBM QMF for z/OS 失败并出现通信错误
IBM QMF for z/OS 连接失败 (例如 SELECT * FROM HISDEMO1。Dbo。客户) 将返回以下错误。
A communications error was detected.
Message No: DSQ10427.
IBM QMF for z/OS 消息和代码参考将 QMF 消息DSQ10427定义为 SQLCODE -30081。 IBM DB2 for z/OS 代码参考将 SQLCODE -30081 定义为通信错误。
解决方案是验证 Windows 防火墙例外列表是否包含 DRDA 服务计算机上的 MsDrdaService.exe 程序。
在“开始”菜单上,指向控制面板,依次单击“系统和安全”、“Windows 防火墙”、“允许程序或功能通过 Windows 防火墙”、“更改设置”、“允许其他程序”、“浏览”、输入“%SNAROOT%\MsDrdaService.exe”,然后单击“添加”,然后单击“确定”。
重新启动 DRDA 服务。
DRDA 客户端 SELECT 或 CALL 语句失败
DRDA 客户端程序将绑定一组包含基本 DECLARE CURSOR 语句的标准包,用于定义如何提取和返回 SELECT 和 CALL 语句的结果。 如果 语句失败,则检查查看包或集合是否列在 IgnoreStandardPacakges.txt 文件中。 如果已列出,请删除引用,重新绑定并重新执行 语句。
访问关系数据库连接失败
DRDA 服务将使用 MsDrdaService.exe.config 中的连接字符串连接到SQL Server数据库,以响应 DRDA ACCRDB (Access 关系数据库) 请求。 在某些情况下,SQL Server数据库连接尝试可能会失败,并出现以下错误。
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server).
DRDA 服务将向 DRDA 客户端返回以下 IBM DB2 错误。
SQLCODE -30041
SQLSTATE 57013
Error Text: EXECUTION FAILED DUE TO UNAVAILABLE RESOURCES THAT WILL AFFECT THE SUCCESSFUL EXECUTION OF SUBSEQUENT COMMANDS AND SQL STATEMENTS.
在这些情况下,应利用 Microsoft SQL Server 文档和最佳做法来确定连接失败的原因。
使用主机启动的 ESSO 时身份验证失败的问题
从 DB2 for z/OS 接收入站连接时使用 DRDA 服务身份验证,DRDA 服务将仅基于用户名进行身份验证。 DRDA ACCSEC(访问安全)SECMEC(安全机制)是 USRIDONL(仅用户 ID)。
在处理 DRDA SECCHK (安全检查) 时,DRDA 服务可能会将以下错误写入跟踪侦听器。
无法对用户进行身份验证:SSO LogonExternalUser 使用指定的 userid/passwd 失败。
为了在使用主机启动的企业单一登录时支持此身份验证方法,必须在关联应用程序中将“验证外部凭据”属性设置为“True”。
参数名称包含连字符时无法处理 BNDSQLSTT 的问题
根据 MSDN,Microsoft SQL Server无法识别以分隔符的变量名称和存储过程参数。 这些标识符的类型必须符合常规标识符的规则。 请参阅 https://msdn.microsoft.com/library/ms176027.aspx。 但是,PL/I 和 COBOL 参数名称包含连字符和其他特殊字符。 解决方案是让 DRDA 服务通过删除特殊字符并将 替换为单个下划线来处理 BGNBND BNDSQLSTT。 例如,DRDA 服务将静态 SQL 参数名称“PARM-1”替换为SQL Server存储过程参数名称“PARM_1”。 将 BGNBIND BNDSQLSTT 处理到SQL Server存储过程或静态 SQL for DB2 XML 定义文件时,DRDA 服务使用替换的值。 请参阅 T-SQL 引用中的无效字符列表,位于 https://msdn.microsoft.com/library/aa224033(v=SQL.80).aspx。
原始值 | 替换的值 |
---|---|
代字号 (~) | |
连字符 (-) | |
惊叹号 (!) | |
左括号 ({) | |
百分号 (%) | |
右括号 (}) | |
插入号 (^) | |
撇号 (') | |
“与”符号 (&) | |
句点 (.) | |
左圆括号 (() | |
反斜杠 (\) | |
右圆括号 ()) | |
重音符号 (`) |
DRDA 服务将无效字符替换为单个下划线。
当一致性令牌不可读时处理 BGNBND BNDSQLSTT 时出现问题
解决方案是让 DRDA AS 使用 8 字节一致性令牌的十六进制表示形式处理 BGNBND BNDSQLSTT。
连接到SQL Server镜像伙伴时出现连接超时问题
在服务启动时加载自定义绑定侦听器时出现问题
如果在服务启动时无法加载自定义绑定侦听器,DRDA 服务将返回警告。 警告不会阻止 DRDA 服务启动。
当 DRDA 服务无法访问自定义绑定侦听器,或者将自定义绑定侦听器配置为将绑定副本写入 XML 或跟踪文件的目录时,可能会导致此问题。 管理员应设置对这些目录的相应访问控制列表权限。
HIS 运行时用户组的所有成员都必须对安装了自定义绑定侦听器动态链接库的程序文件系统目录具有读取和执行权限。 HIS 运行时用户组的所有成员都必须具有写入、读取和执行权限,才能将复制绑定到自定义绑定侦听器将绑定副本写入 XML 和跟踪文件的目录。
自定义绑定侦听器在回调接口上不返回时出现问题。
当自定义绑定侦听器无法向 DRDA 服务返回 CREATE PROCEDURE DDL 语句时,DRDA 服务不会将 BGNBNDRM (Begin 绑定错误回复消息) 返回到 DRDA 应用程序请求程序客户端。 当自定义绑定侦听器组件不返回回调接口上的任何信息时, errorWhenNoCallback 属性指示 DRDA 服务将 BGNBNDRM (开始绑定回复消息) 返回到 DRDA AR 客户端。 此 可选 属性接受 布尔 值。 默认值为 true。
<packageBindListeners>
<packageBindListener
type="Microsoft.HostIntegration.Drda.Common.PackageBindListener, Microsoft.HostIntegration.Drda.Common, Version=9.0.1000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"
errorWhenNoCallback="true"/>
</packageBindListeners>
DRDA 服务应用程序配置文件中 packageBindListener 的默认值。
将 DRDA 服务作为命令行应用程序启动时出现问题
将 DRDA 服务作为命令行应用程序启动时,程序可能会失败并显示错误。
C:\Program Files\Microsoft Host Integration Server 2013\system>MsDrdaService.exe -c
Only one usage of each socket address (protocol/network address/port) is normally permitted
解决方案是停止已作为 Windows 服务运行的 DRDA 服务。
使用命令窗口,可以停止和启动 DRDA 服务。
在“开始”菜单上,依次指向“所有程序”、“Microsoft Visual Studio 2010”、“Visual Studio Tools”,右键单击“Visual Studio x64 Win64 命令提示符 (2010) ”,然后单击“以管理员身份运行”。 将显示“ 用户帐户控制 ”对话框。 单击 “是” 继续操作。
在命令提示符下,输入 net stop msdrdaservice ,然后按 Enter。
C:\Windows\system32>net stop msdrdaservice The Microsoft Service for DRDA service is stopping. The Microsoft Service for DRDA service was stopped successfully.
使用命令窗口,可以将 DRDA 服务作为应用程序运行。
在“开始”菜单上,依次指向“所有程序”、“Microsoft Visual Studio 2010”、“Visual Studio Tools”,右键单击“Visual Studio x64 Win64 命令提示符 (2010) ”,然后单击“以管理员身份运行”。 将显示“ 用户帐户控制 ”对话框。 单击 “是” 继续操作。
在命令提示符下,输入 net stop msdrdaservice ,然后按 Enter。
C:\Windows\system32>net stop msdrdaservice The Microsoft Service for DRDA service is stopping. The Microsoft Service for DRDA service was stopped successfully.
在命令提示符下,输入 cd C:\Windows\system32>cd C:\Program Files\Microsoft Host Integration Server 2013\system ,然后按 Enter。
C:\Program Files\Microsoft Host Integration Server 2013\system>MsDrdaService.exe -c DrdaAs Information: 0 : [10/4/2011 4:51:48 PM] Microsoft Service for DRDA (build: 9.0.1203.0 ) DrdaAs Information: 0 : [10/4/2011 4:51:48 PM] TCP communication manager listening on port 446
注意
DRDA 服务日志编写器将向控制台窗口输出信息。
无法加载自定义包绑定侦听器
在服务启动时,如果 DRDA 服务无法加载自定义包绑定侦听器,则 DRDA 服务将记录以下警告。
Warning:0:2:[Apr 30 2012 16:04:12.996] SessionManager::Initialize PackageBindingListener failed to load type: " Microsoft.HostIntegration.Drda.Common.PackageBindListener, Microsoft.HostIntegration.Drda.Common, Version=9.0.1000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL "
在运行时,如果 MsDrdaService 无法加载自定义包绑定侦听器,则 MsDrdaService 不会返回错误。
注意
DRDA 服务将继续运行,而不会发出其他警告。 DRDA 服务支持多个并发自定义包绑定侦听器。 IT 专业人员或开发人员应根据启动 DRDA 服务后的初始警告更正此问题。
针对 SYSIBM 进行查询。SYSDUMMY1返回 SQLCODE -204
若要定义 SYSIBM 架构并SYSDUMMY1表,请编辑 USE 子句以引用目标SQL Server数据库,然后执行 语句。
/****** HAS OUTPUT PARAMS ******/
执行 CREATE PROCEDURE 语句时,DRDA 服务内部绑定将包含此注释。
USE [CONTOSO]
GO
/****** Object: Schema [SYSIBM] Script Date: 09/26/2012 13:21:38 ******/
IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'SYSIBM')
EXEC sys.sp_executesql N'CREATE SCHEMA [SYSIBM] AUTHORIZATION [dbo]'
GO
/****** Object: Table [SYSIBM].[SYSDUMMY1] Script Date: 09/26/2012 13:21:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[SYSIBM].[SYSDUMMY1]') AND type in (N'U'))
BEGIN
CREATE TABLE [SYSIBM].[SYSDUMMY1]([IBMREQD] [char](1) NOT NULL) ON [PRIMARY]
END
GO
SET ANSI_PADDING OFF
GO
INSERT [SYSIBM].[SYSDUMMY1] ([IBMREQD]) VALUES (N'Y')
用于创建 SYSIBM 架构和SYSDUMMY1表的 DDL。
查询返回空参数值
CREATE PROCEDURE 语句应包含注释,表示将使用一个或多个 OUTPUT 参数从 SELECT 语句返回数据。
/****** HAS OUTPUT PARAMS ******/
执行 CREATE PROCEDURE 语句时,DRDA 服务内部绑定将包含此注释。
查询返回空结果集
执行 DECLARE CURSOR FOR SELECT 时,DRDA 服务可能会返回空的结果集和以下错误。
THE CURSOR IS NOT IN A PREPARED STATE
SQLSTATE: 26501, SQLCODE: -514
CREATE PROCEDURE 语句应包含注释,表示存储过程将返回结果集。
/****** RETURN RESULTSET ******/
执行 CREATE PROCEDURE 语句时,DRDA 服务内部绑定将包含此注释。
绑定复制失败,SQLCODE -904
使用 DB2 管理员绑定复制包面板执行 DRDA BGNBND (Begin Bind) 将包从 DB2 for z/OS 复制到SQL Server时,DB2 系统可能会返回 SQLCODE -904。
此问题可能是由不正确的安全配置引起的,该配置与用于登录主机会话的 3270 配置文件相关联。
执行包失败,SQLCODE 805
使用 DB2 for z/OS 本地附加程序 (TSO、CICS) 执行从 DB2 for z/OS 到 SQL Server 的静态 SQL 包时,DB2 系统可能会返回 SQLCODE -805。
此问题可能是由于 DB2 for z/OS 与SQL Server完全限定包命名约定的映射不正确导致的。 检查绑定副本是否在SQL Server架构中生成了与 DB2 for z/OS 文本或匹配集合名称匹配的存储过程。 此外,检查 MsDrdaService.exe.config databaseAliases 包括任何必需的 DB2 位置以SQL Server数据库名称映射,或包含 DB2 集合以SQL Server架构名称映射。
<databaseAlias sourceLocation="CONTOSO"
sourceCollection="DSN8HC91"
targetDatabase="ContosoRetailDW"
targetSchema="DSN8910" />
<databaseAlias sourceLocation="NWIND"
sourceCollection="DSN8HC91"
targetDatabase="Northwind"
targetSchema="DSN8910" />
</databaseAliases>
此外,检查 MsDrdaService.exe.config 的数据库元素中的 packageProcedureSchemaList 属性的逗号分隔值。
packageProcedureSchemaList="DBO,DSN8910"