2009-01-26 43 views
1

由於我使用JRC的更新版本,數據庫連接信息的替換不再起作用。我不知道爲什麼。此代碼從去年秋天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北德Suche NACH JNDI-Namen(UserY)'。這意味着JRC無法找到給定的JNDI名稱。

有沒有人知道這些JRC版本之間的一些變化?有誰知道一個解決方案?

回答

1

我在長時間的調試會話後發現了問題和解決方法。

// 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