2011-10-10 107 views
1

在报告生成期间是否可以在IReports/jasper报告中执行“插入查询”?在jasper报告中插入查询

+0

你想达到什么结果?您可以尝试在预构建报告事件的调用应用程序中创建触发器。 –

回答

0

是的,您需要的想法是使用此语法的参数:$P!{PARAM_NAME}

因此,您的整个SQL查询(或其他类型的查询)可能只是$P!{SQL}。然后你传入你需要的动态SQL。

更新: 在阅读Sharad的评论后,我意识到我的答案并不好。我写的是真的......但它没有解决核心问题。

不,您的报告无法真正执行插入语句。严格地说,我相信这不是不可能的。您可以在建立连接的.jar文件中添加scriptlet或自定义函数,并执行插入操作。但实际上,一个报告将执行一个或多个查询。 JR框架不打算执行插入或更新。

+0

在我们的实验中,我们已经看到,如果我们使用插入或更新,IReport会给出错误...请给我们一个洞察这个... –

+0

@mdahlman:我做了什么,创建了一个输入控件“$ P!{p_insert_sql }“并设置默认值”“INSERT INTO t_error_log(LogID)VALUES(2)”但它显示的错误:不能用executeQuery()发出数据操作语句() – Sharad

+0

你不觉得如果我们有这个工具来插入或更新数据库通过JasperReport服务器,我们可以在任何级别做更好的报告,然后我们可以使用JasperReport Server作为入口点,也可以像Excel一样,只需在数据库中创建表格一次,然后通过Jasper插入记录并查看报告,我们不必实际上一次又一次地使用数据库来插入或更新记录。 – Sharad

0

是的,你可以。您想要显示报告时可以执行查询。这是一个适合我的示例。

try { 
     Map parameters = new HashMap(); 
     connectionString ="jdbc:mysql://localhost/myDb", "myUsername", "myPassword" 
     Class.forName("com.mysql.jdbc.Driver"); 
     Connection conn = DriverManager.getConnection(connectionString); 
     PreparedStatement stmt = conn.prepareStatement(query); 
     ResultSet rs = stmt.executeQuery(); 
     JRResultSetDataSource rsdt = new JRResultSetDataSource(rs); 

     JasperPrint jp; 
     jp = JasperFillManager.fillReport("sourceFileName.jasper", parameters, rsdt); 
     JasperViewer jv = new JasperViewer(jp, false); 
     jv.setVisible(true); 

    } catch (ClassNotFoundException | SQLException | JRException ex) { 
     ex.printStackTrace(); 
    }