Java中打开HANA DB Crystal Report遇ValueType异常求助
匹配Crystal Report Java SDK与报表版本
你用的报表是CR2016(14.2.5.xxx版本),必须保证Java SDK版本和这个CR版本完全对应。ValueType异常大多是SDK和报表版本不兼容导致的,比如用了不对的SDK版本处理14.2.x的报表。直接下载对应CR2016 FP5(Feature Pack 5,对应14.2.5系列)的Java SDK包替换现有依赖。调整JDBC驱动版本
ngdbc(SAP HANA JDBC)驱动版本要和CR SDK、HANA服务器版本兼容。你当前用的2.17.12可能和CR2016的JDBC适配层不匹配,建议降级到2.15.x或者升级到2.18.x版本测试,优先选CR2016官方推荐的HANA驱动版本。修改setTableLocation代码逻辑
别直接用clientDoc.getDatabaseController().setTableLocation(table, table);这种写法,报表里的表结构如果有特殊字段(比如HANA特定数据类型),会导致SDK解析异常。换成分步处理:- 先获取报表里的原始表对象:
(根据实际表的索引或名称获取,不要硬写0)ITable origTable = clientDoc.getDatabaseController().getDatabase().getTables().getTable(0); - 创建新表对象副本,手动配置连接信息:
ITable newTable = origTable.clone(true); IConnectionInfo connInfo = newTable.getConnectionInfo(); // 按需设置新的连接参数 connInfo.setUserName("你的用户名"); connInfo.setPassword("你的密码"); connInfo.setAttributes("JDBC Connection String=jdbc:sap://你的HANA服务器地址:30015/?databaseName=你的数据库名"); - 调用setTableLocation时传入原始表和新表:
clientDoc.getDatabaseController().setTableLocation(origTable, newTable);
- 先获取报表里的原始表对象:
检查报表中的特殊数据类型
打开CR2016报表,看看有没有用HANA的非常规数据类型(比如几何类型、自定义数据类型),这些类型在Java SDK里没有对应的ValueType映射。如果有,把这些字段转成SDK支持的类型(比如VARCHAR、INT),重新发布报表。处理Java 11兼容性问题
CR2016的Java SDK原本基于Java 8开发,在Java 11下运行会有模块兼容问题。启动时添加以下参数:--add-modules java.se.ee --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED --add-opens java.sql/java.sql=ALL-UNNAMED同时确保项目里没有混合Java 8和Java 11的依赖包。
内容的提问来源于stack exchange,提问作者Marco Tizzano

