Заменить соединение с базой данных для подотчетов с JRC - PullRequest
1 голос
/ 26 января 2009

Поскольку я использую более новую версию 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 Suche nach JNDI-Namen (UserY)». Это означает, что JRC не может найти данное имя JNDI.

Кто-нибудь знает некоторые изменения между этими выпусками JRC? И кто-нибудь знает решение?

1 Ответ

1 голос
/ 28 января 2009

Я нашел проблему и обходной путь после долгого сеанса отладки.

// 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) out. 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());
}

Я надеюсь, что кто-то сэкономит время и деньги с этим обходным путем. ;-) Я также разместил его на официальном форуме.

Форум: Java Development - Crystal Reports

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...