由于我使用的是JRC的较新版本,因此替换数据库连接信息不再起作用。我不知道为什么。这段代码从去年秋天开始就与JRC版本一起使用(不幸的是,我没有发布号):
ReportClientDocument doc = new ReportClientDocument();
doc.open("report.rpt");
IDatabase db = null; // get sub report database
// we'll overwrite the database connection information within
// the chosen report.
Map<String, String> bag = new HashMap<String, String>();
bag.put("Connection URL", "jdbc:oracle:thin:@LOCALHOST:1521:DATABASENAME");
bag.put("Server Type", "JDBC (JNDI)");
bag.put("Database DLL", "crdb_jdbc.dll");
bag.put("Database Class Name", "oracle.jdbc.driver.OracleDriver");
for (Object table : db.getTables()) {
updateTable(dhb, dc, (ITable)table, bag);
}
...
private void updateTable(DatabaseController dc, ITable table,
Map<String, String> bag) throws ReportSDKException {
ITable t = (ITable)table.clone(true);
LOGGER.debug(t.getName());
LOGGER.debug("1: " + t.getConnectionInfo().getAttributes());
IConnectionInfo connInfo = t.getConnectionInfo();
connInfo.setUserName("UserX");
connInfo.setPassword("xxxxx");
connInfo.setAttributes(new PropertyBag(bag));
// LOGGER.debug("ConnInfo Kind: " + connInfo.getKind());
t.setConnectionInfo(connInfo);
// t.setName(((ITable)table).getName());
t.setQualifiedName("UserX" + "." + table.getName());
dc.setTableLocation(table, t);
LOGGER.debug("2: " + t.getConnectionInfo().getAttributes());
}
我收到此错误:“ Fehler bei der追求nach JNDI-Namen(UserY)”。这意味着JRC找不到给定的JNDI名称。
有谁知道这些JRC版本之间的一些变化?有人知道解决方案吗?
最佳答案
经过长时间的调试会话后,我发现了问题以及解决方法。
// incomplete code example
for(Object table : db.getTables()) {
ITable t = (ITable)((ITable)table).clone(true);
System.out.println(t.getName());
// modifying t, bag is an existing instance of class PropertyBag
t.getConnectionInfo().setAttributes(bag);
// dc is an existing instance of DatabaseController
dc.setTableLocation((ITable)table, t)
}
db.getTables()
包含3个表A,B和C。如果我们运行上面的代码,则System.out
将A,A,B打印到控制台。如果我们要注释掉
dc.setTableLocation((ITable)table, t)
。将打印A,B,C。我假设dc.setTableLocation((ITable)table, t)
在内部修改表列表。我们正在使用以下解决方法:
// incomplete code example
// WORKAROUND CODE
Map<ITable, ITable> oldNewMap = new HashMap<ITable, ITable>();
for(Object table : db.getTables()) {
ITable t = (ITable)((ITable)table).clone(true);
System.out.println(t.getName());
// modifying t, bag is an existing instance of class PropertyBag
t.getConnectionInfo().setAttributes(bag);
// WORKAROUND CODE
oldNewMap.put((ITable)table, t);
}
// WORKAROUND CODE
for (Entry<ITable, ITable> e : oldNewMap.entrySet()) {
dc.setTableLocation(e.getKey(), e.getValue());
}
我希望有人可以通过这种解决方法节省时间和金钱。 ;-)我也将其发布到了官方论坛。
Forum: Java Development - Crystal Reports
关于java - 用JRC替换子报表的数据库连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/479405/