SQLException from SQL Server 2016 中的 DB2OLEDB 驱动程序和错误消息
DB2OLEDB Driver and error messages in SQLException from SQL Server 2016
我们正在使用 SQL Server 2016,通过 Microsoft OLE DB Provider for DB2 5.0 版链接服务器连接到 zDB2(大型机)。
在链接服务器 (zDB2) 上远程执行失败的 SQL 语句时,错误描述在 SQL studio 中很清楚,但在 Java.
中没有用
语句示例(缺少架构名称):
EXEC (N'UPDATE TABLENAME SET COLUMN1=''SOMEVALUE'' WHERE COLUMN2= ''032'' ') AT ZDB2
在 SQL Studio 中给出以下结果:
OLE DB provider "DB2OLEDB" for linked server "ZDB2" returned message "DB2GRP.TABLENAME IS AN UNDEFINED NAME SQLSTATE: 42704, SQLCODE: -204".
Msg 7215, Level 17, State 1, Line 6
Could not execute statement on remote server 'ZDB2'.
但以下结果导致 Java SQL异常:
com.microsoft.sqlserver.jdbc.SQLServerException: Could not execute statement on remote server 'ZDB2'.
SQL State: S0001
SQL Error code: 7215
使用调试器并检查 SQL 异常对象,SQL异常似乎没有关于错误的其他数据。
除了 "Could not execute statement on remote server" 之外,我如何从 SQLException 中得到更有用的解释?
关于 S0001 和 7215 含义的文档在哪里? (我已经用谷歌搜索了)
提前致谢。
我相信 S0001 和 7215 是 Microsoft JDBC 驱动程序的响应。 DB2 错误信息是 "SQLSTATE: 42704, SQLCODE: -204",不幸的是,它没有出现在 Java 输出中。看起来 Microsoft 驱动程序正在替换它自己的 sqlstate/code 而不是传递 DB2 的。
-204 是“name 是一个未定义的名称”(如 sqlstate 和代码之前的文本所述)。
http://www.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/codes/src/tpc/db2z_n.html
既然您提到了 Java 代码,请注意 DB2 为直接连接提供了一个 JDBC 驱动程序。这至少应该消除 MS 驱动程序干扰 DB2 返回的错误代码的可能性。您通常必须从您的系统人员那里获得驱动程序和许可证文件——据我所知,它们不是由 IBM 公开提供的,但它们包含在 DB2 for z/OS 中。但我建议尝试使用 IBM 驱动程序,除非有一些令人信服的理由说明您必须使用 Microsoft 驱动程序——我对 OLE DB Provider 和 JDBC.
的提及感到困惑
显然,当使用 Microsoft 的 JDBC 驱动程序时,来自链接服务器的错误存储为语句中的警告,而不是 SQLException 的一部分。
我是这样做的:
try{
...
} catch (SQLException e) {
SQLWarning sqlWarning = currentStatement.getWarnings();
if (sqlWarning != null) {
warning = sqlWarning.getMessage();
}
}
我们正在使用 SQL Server 2016,通过 Microsoft OLE DB Provider for DB2 5.0 版链接服务器连接到 zDB2(大型机)。
在链接服务器 (zDB2) 上远程执行失败的 SQL 语句时,错误描述在 SQL studio 中很清楚,但在 Java.
中没有用语句示例(缺少架构名称):
EXEC (N'UPDATE TABLENAME SET COLUMN1=''SOMEVALUE'' WHERE COLUMN2= ''032'' ') AT ZDB2
在 SQL Studio 中给出以下结果:
OLE DB provider "DB2OLEDB" for linked server "ZDB2" returned message "DB2GRP.TABLENAME IS AN UNDEFINED NAME SQLSTATE: 42704, SQLCODE: -204".
Msg 7215, Level 17, State 1, Line 6
Could not execute statement on remote server 'ZDB2'.
但以下结果导致 Java SQL异常:
com.microsoft.sqlserver.jdbc.SQLServerException: Could not execute statement on remote server 'ZDB2'.
SQL State: S0001
SQL Error code: 7215
使用调试器并检查 SQL 异常对象,SQL异常似乎没有关于错误的其他数据。
除了 "Could not execute statement on remote server" 之外,我如何从 SQLException 中得到更有用的解释?
关于 S0001 和 7215 含义的文档在哪里? (我已经用谷歌搜索了)
提前致谢。
我相信 S0001 和 7215 是 Microsoft JDBC 驱动程序的响应。 DB2 错误信息是 "SQLSTATE: 42704, SQLCODE: -204",不幸的是,它没有出现在 Java 输出中。看起来 Microsoft 驱动程序正在替换它自己的 sqlstate/code 而不是传递 DB2 的。
-204 是“name 是一个未定义的名称”(如 sqlstate 和代码之前的文本所述)。 http://www.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/codes/src/tpc/db2z_n.html
既然您提到了 Java 代码,请注意 DB2 为直接连接提供了一个 JDBC 驱动程序。这至少应该消除 MS 驱动程序干扰 DB2 返回的错误代码的可能性。您通常必须从您的系统人员那里获得驱动程序和许可证文件——据我所知,它们不是由 IBM 公开提供的,但它们包含在 DB2 for z/OS 中。但我建议尝试使用 IBM 驱动程序,除非有一些令人信服的理由说明您必须使用 Microsoft 驱动程序——我对 OLE DB Provider 和 JDBC.
的提及感到困惑显然,当使用 Microsoft 的 JDBC 驱动程序时,来自链接服务器的错误存储为语句中的警告,而不是 SQLException 的一部分。
我是这样做的:
try{
...
} catch (SQLException e) {
SQLWarning sqlWarning = currentStatement.getWarnings();
if (sqlWarning != null) {
warning = sqlWarning.getMessage();
}
}