首页 > 解决方案 > 如何使用 simpleJdbcCall 在存储过程中获取 XML 输出参数

问题描述

我有一个返回 XML 的过程,我正在使用 simpleJdbcCall 来执行它。当我以地图形式获得结果时,它返回一个 SQLServerSQLXML。我将它转换为 java.sql.SQLXML 以使用 getString() 方法但没有成功。它抛出一个 NegativeArraySize 异常。当我在 SQLServer Management Studio 中执行该过程时,它会工作并生成 XML。

我已经尝试获取二进制流但没有成功,它只返回了两个 unicode 字符:ÿ(255)和þ(254)。

这是我的 SimpleJdbcCall:

SimpleJdbcCall simpleCall = new SimpleJdbcCall(dataSource)                                               
                        .withCatalogName("dbo")                          
                        .withProcedureName("pProcName")                                          
                        .withoutProcedureColumnMetaDataAccess()                                          
                        .declareParameters(new SqlParameter("@ID", Types.BIGINT))                                        
                        .declareParameters(new SqlOutParameter("@XmlOut", Types.SQLXML));

我已经设置了 ID 并将其放在 MapSqlParameterSource 上,然后执行该过程:


MapSqlParameterSource params = new MapSqlParameterSource();

params.addValue("@ID", inDTO.getIdCertificado()); 

Map<String, Object> mapa = simpleCall.execute(params);
SQLXML xml = (SQLXML) mapa.get("@XmlOut");
String val = xml.getString();

标签: javasql-serverspringjdbc

解决方案


我可以开始使用输入流。似乎指针在末尾,所以我只需要重置它并将我的 xml 解析为文档:

InputStream binaryStream = xml.getBinaryStream();
binaryStream.reset();
DocumentBuilder parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document result = parser.parse(binaryStream);

然后使用它来获取我的属性和值。


推荐阅读