是否可以在JasperReports中使用表值参数?

时间:2017-10-30 20:03:26

标签: java sql-server jdbc jasper-reports

是否可以在JasperReports中使用Table Valued Parameter

我在SQL SERVER上创建了一个新类型,我正在尝试将它作为param传递给jasper sql过程:

CREATE TYPE codlist AS TABLE (
    [cod] int NOT NULL PRIMARY KEY
);
GO

我在Jasper Studio中尝试过,但是当我将table参数设置为object时,我有一些错误:

com.microsoft.sqlserver.jdbc.SQLServerException: Operand type clash: varbinary is incompatible with codlist. 

当我将table参数设置为SQLServerDataTable时:Parameter type not supported in query

使用纯Java代码查看我的JDBC测试:

// Create an in-memory data table.  
SQLServerDataTable sourceDataTable = new SQLServerDataTable();

// Define metadata for the data table.  
sourceDataTable.addColumnMetadata("cod", java.sql.Types.INTEGER);

// Populate the data table.  
sourceDataTable.addRow(344057);
sourceDataTable.addRow(344058);
sourceDataTable.addRow(344132);
sourceDataTable.addRow(344135);
sourceDataTable.addRow(344159);
// Pass the data table as a table-valued parameter using a prepared statement.  
SQLServerPreparedStatement pStmt
        = (SQLServerPreparedStatement) connection.prepareStatement(
                "EXECUTE dbo.procedure_test_table_valued_parameter ?;");
pStmt.setStructured(1, "dbo.codlist", sourceDataTable);

try (ResultSet rs = pStmt.executeQuery()) {
    while (rs.next()) {
        System.out.println(rs.getInt(1) + " - " + rs.getString(2));
    }
}

我将调用一个存储过程,该存储过程将作为参数接收表值参数。 我尝试了但它不接受我传递这个对象,它不接受任何其他:数组,列表等。

这是我的jrxml

<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Principal" pageWidth="595" pageHeight="842" whenNoDataType="BlankPage" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="0" bottomMargin="0" uuid="dc6d0467-36c2-4eb9-ab5e-78e7d903d9aa">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="SQLSRV"/>
    <property name="com.jaspersoft.studio.unit." value="pixel"/>
    <property name="com.jaspersoft.studio.data.sql.SQLQueryDesigner.sash.w1" value="265"/>
    <property name="com.jaspersoft.studio.data.sql.SQLQueryDesigner.sash.w2" value="724"/>
    <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
    <parameter name="PATH" class="java.lang.String">
        <defaultValueExpression><![CDATA[""]]></defaultValueExpression>
    </parameter>
    <parameter name="COD" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[94807]]></defaultValueExpression>
    </parameter>
    <parameter name="CODLIST" class="com.microsoft.sqlserver.jdbc.SQLServerDataTable" isForPrompting="false">
        <parameterDescription><![CDATA[]]></parameterDescription>
    </parameter>
    <queryString language="plsql">
        <![CDATA[EXEC dbo.pr_with_table_as_parameter $P{CODLIST}]]>
    </queryString>

1 个答案:

答案 0 :(得分:0)

您使用plsql default QueryExecuterFactory使用扩展PlSqlQueryExecuterFactoryJRJdbcQueryExecuterFactory returns JRJdbcQueryExecuter将使用{ {3}}当使用未处理的类类型时,请调用java.sql.PreparedStatement,因为在您的情况下,它不是过程调用(查询与statement.setObject(parameterIndex, parameterValue)不匹配)

结论

不,它不可能

是的,可能您需要实现自己的JRQueryExecuter,并返回您自己的jasperreports.properties,并使用您自己的名称在<queryString language="mynewsql">注册,实施您的致电(司机),然后在psql

中注明

按照上面的步骤显示final = tf.add(add1,add2) print(final) Tensor("Add_35:0", shape=(1, 32, 32, 7, 1), dtype=float32) QueryExecuterFactory的设置方式,你应该没问题。