常見問題的解決方案

使用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 服務支援自定義系結接聽程式,其可能支援兩種靜態 SQL for DB2 XML 檔格式的其中一種: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 Server 以 v90 或 v85 格式寫入 DB2 XML 檔案的靜態 SQL。 這個選擇性屬性接受 v85 或 v90 的字串值。 預設值為 v90 。

在此情況下,您應該嘗試指定值 「v85」,然後重新要求系結或系結複製命令。

packageXmlFormat=“v85”

DB2 封裝 XML 格式屬性的靜態 SQL。

注意

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服務組態。

First, check that you configured Enterprise Single Sign-On for Host-Initiated SSO and then re-started the EntSSO service, by following steps 6 and 7 in the section titled “Configure HIS 2010 and ESSO V4.5”.

其次,請遵循標題為「定義 Windows 起始 SSO 的 ESSO 聯盟應用程式」一節中的步驟 11-13,確認您已正確對應主機和 Windows 認證。 此外,在測試連線時,請確認您使用的是來自 Microsoft Client for DB2 的正確主機認證。

IBM QMF for z/OS 失敗且位置名稱不正確

IBM QMF for z/OS 連線失敗 (例如 SELECT * FROM HISDEMO1。Dbo。CUSTOMERS) 會傳回下列錯誤。

The location name is not known to the local DB2 subsystem.

解決方案是確認 DB2 的 z/OS 組態資料庫,並視需要重新啟動 DDF。

首先,請確認您已 (SYSDATA 更新 z/OS 目錄資料表的 DB2。LOCATIONS、SYSLOG。IPNAMES 和SSDATA。使用遠端關係資料庫) USERNAMES。

其次,請向 DB2 要求 z/OS 系統管理員停止並重新啟動適用於 z/OS 分散式數據設施的 DB2 (DDF) ,這是 DRDA 通訊協定閘道,然後重新嘗試 SQL 查詢。

IBM QMF for z/OS 失敗,發生無法使用的資源錯誤

IBM QMF for z/OS 連線失敗 (例如 SELECT * FROM HISDEMO1。Dbo。CUSTOMERS) 會傳回下列錯誤。

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 的 z/OS 組態資料庫,並視需要重新啟動 DDF。

首先,請確認您已 (SYSDATA 更新 z/OS 目錄資料表的 DB2。LOCATIONS、SYSLOG。IPNAMES 和SSDATA。使用遠端關係資料庫) USERNAMES。

其次,請向 DB2 要求 z/OS 系統管理員停止並重新啟動適用於 z/OS 分散式數據設施的 DB2 (DDF) ,這是 DRDA 通訊協定閘道,然後重新嘗試 SQL 查詢。

適用於 z/OS 的 IBM QMF 失敗,發生語法錯誤或存取規則違規的問題

IBM QMF for z/OS、SPUFI、DB2 管理員 或其他程式無法查詢 DB2 的 z/OS 別名 (例如 DBO。REMAREAS) SQL Server 數據表 (例如HISDRDA1。Dbo。區域) 使用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。CUSTOMERS) 會傳回下列錯誤。

A communications error was detected.
Message No: DSQ10427.

IBM QMF for z/OS 訊息和代碼參考會將 QMF 訊息定義為 SQLCODE -30081 DSQ10427。 IBM DB2 for z/OS 程式代碼參考會將 SQLCODE -30081 定義為通訊錯誤。

解決方案是確認 Windows 防火牆例外狀況清單包含DRDA服務電腦上的 MsDrdaService.exe 程式。

  1. 在 [開始] 功能表上,指向 [控制台],單擊 [系統和安全性],按兩下 [Windows 防火牆],按兩下 [允許透過 Windows 防火牆的程式或功能],單擊 [變更設定],單擊 [允許其他程式],按兩下 [流覽],輸入 “%SNAROOT%\MsDrdaService.exe”,然後單擊 [新增],然後按兩下 [確定]。

  2. 重新啟動DRDA服務。

DRDA 用戶端 SELECT 或 CALL 語句失敗

DRDA 用戶端程式會系結一組包含基本 DECLARE CURSOR 語句的標準套件,以定義如何在 SELECT 和 CALL 語句上擷取和傳回結果。 如果語句失敗,請檢查封裝或集合是否列在 IgnoreStandardPacakges.txt 檔案中。 如果列出,請移除參考、重新系結並重新執行 語句。

存取關係資料庫連線失敗

DRDA 服務會使用 MsDrdaService.exe.config 中的連接字串聯機到 SQL Server 資料庫,以回應DRDA ACCRDB (Access Relational Database) 要求。 在某些情況下,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 接收 Z/OS 的系結連線使用DRDA服務驗證時,DRDA 服務只會根據使用者名稱進行驗證。 DRDA ACCSEC (Access Security) SECMEC (Security Mechanism) 為 USRIDONL (使用者識別符) 。

DRDA 服務可能會在處理DRDA SECCHK (安全性檢查) 時,將下列錯誤寫入追蹤接聽程式。

  • 無法驗證使用者: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」。 DRDA 服務會在將 BGNBIND BNDSQLSTT 處理成 SQL Server 預存程式或 DB2 XML 定義檔的靜態 SQL 時,使用已取代的值。 請參閱 T-SQL 參考中的無效字元清單,網址為 https://msdn.microsoft.com/library/aa224033(v=SQL.80).aspx

原始值 已取代值
波浪號 (~)
連字號 (-)
驚嘆號 (!)
左大括號 ({)
百分比 (%)
右大括號 (})
插入號 (^)
apostrophe (')
連字號 (&)
句號 (.)
左括號 (()
倒斜線 (\)
右括號 ())
重音符號 (`)

DRDA 服務會以單一底線取代無效的字元。

無法讀取一致性令牌時處理 BGNBND BNDSQLSTT 的問題

解決方案是讓DRDA AS使用8位元組一致性令牌的十六進位表示法來處理 BGNBND BNDSQLSTT。

線上到 SQL Server 鏡像夥伴時的連線逾時問題

資料庫鏡像期間可能發生的失敗

在服務啟動時載入自定義系結接聽程式時發生問題

DRDA 服務會在服務啟動時無法載入自定義系結接聽程式時傳回警告。 警告不會防止DRDA服務啟動。

當DRDA服務無法存取自定義系結接聽程式,或將自定義系結接聽程式設定為將系結複製寫入 XML 或追蹤檔案的目錄時,可能會造成此問題。 系統管理員應該將這些目錄設定適當的訪問控制清單許可權。

HIS Runtime 使用者群組的所有成員都必須具有安裝自定義系結接聽程式動態連結庫的程式檔系統目錄讀取和執行許可權。 HIS Runtime Users 群組的所有成員都必須具有寫入、讀取和執行許可權,才能將複製系結至自定義系結接聽程式將系結複製到 XML 和追蹤檔案的目錄。

自定義系結接聽程式未在回呼介面上傳回時發生問題。

當自定義系結接聽程式無法返回DRDA服務 CREATE PROCEDURE DDL 語句時,DRDA 服務不會傳回 BGNBNDRM (Begin Bind Error Reply Message) 至 DRDA 應用程式要求者用戶端。 errorWhenNoCallback 屬性會指示DRDA服務在自定義系結接聽程式元件未傳回回介面上任何資訊時, (開始系結回復訊息) 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

解決方案是停止已執行DRDA服務做為Windows服務。

使用命令視窗,您可以停止並啟動DRDA服務。

  1. 在 [開始] 功能表上,依序指向 [所有程式]、[Microsoft Visual Studio 2010]、指向 [Visual Studio Tools]、以滑鼠右鍵單擊 [Visual Studio x64 Win64 命令提示字符] (2010) ,然後按兩下 [以系統管理員身分執行]。 [ 用戶帳戶控制] 對話框隨即出現。 按一下 [是] 繼續。

  2. 在命令提示字元中,輸入 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服務。

  3. 在 [開始] 功能表上,依序指向 [所有程式]、[Microsoft Visual Studio 2010]、指向 [Visual Studio Tools]、以滑鼠右鍵單擊 [Visual Studio x64 Win64 命令提示字符] (2010) ,然後按兩下 [以系統管理員身分執行]。 [ 用戶帳戶控制] 對話框隨即出現。 按一下 [是] 繼續。

  4. 在命令提示字元中,輸入 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.
    
  5. 從命令提示字元中,輸入 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服務啟動後的初始警告來更正問題。

針對 SYSACA 進行查詢。SYSDUMMY1會傳回 SQLCODE -204

若要定義 SYSUI 架構和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')

DDL 可建立 SYSDL 架構和SYSDUMMY1數據表。

查詢會傳回空的參數值

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

執行DRDA BGNBND (Begin Bind) 將套件從 DB2 for z/OS 複製到 SQL Server 時,使用 DB2 管理員 系結複製套件面板,DB2 系統可能會傳回 SQLCODE -904。

此問題可能是因為與用來登入主機會話的 3270 配置文件相關聯的不正確安全性設定所造成。

執行封裝失敗,SQLCODE 805

從 DB2 for z/OS 執行靜態 SQL 套件到 SQL Server 時,使用 DB2 for z/OS 本機鏈接程式 (TSO、CICS) ,DB2 系統可能會傳回 SQLCODE -805。

此問題可能是因為 db2 for z/OS 對應到完整套件命名慣例 SQL Server 不正確所造成。 檢查系結複本是否在符合 DB2 for z/OS 常值或相符集合名稱的 SQL Server 架構中產生預存程式。 此外,請檢查 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"