1 votes

Remplacez une connexion de base de données pour les sous-rapports avec JRC

Depuis que j'utilise une version plus récente de JRC, un remplacement des informations de connexion à la base de données ne fonctionne plus. Je n'ai aucune idée pourquoi. Ce code fonctionnait avec une version JRC de l'automne dernier (malheureusement je n'ai pas de numéro de version) :

ReportClientDocument doc = new ReportClientDocument();
doc.open("report.rpt");

IDatabase db = null; // obtenir la base de données du sous-rapport

// nous allons écraser les informations de connexion à la base de données dans
// le rapport choisi.
Map bag = new HashMap();
bag.put("URL de connexion", "jdbc:oracle:thin:@LOCALHOST:1521:DATABASENAME");
bag.put("Type de serveur", "JDBC (JNDI)");
bag.put("DLL de base de données", "crdb_jdbc.dll");
bag.put("Nom de la classe de base de données", "oracle.jdbc.driver.OracleDriver");

for (Object table : db.getTables()) {
  updateTable(dhb, dc, (ITable)table, bag);
}

...

private void updateTable(DatabaseController dc, ITable table,
    Map 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("UtilisateurX");
  connInfo.setPassword("xxxxx");
  connInfo.setAttributes(new PropertyBag(bag));
  // LOGGER.debug("Type de ConnInfo : " + connInfo.getKind());
  t.setConnectionInfo(connInfo);
  // t.setName(((ITable)table).getName());
  t.setQualifiedName("UtilisateurX" + "." + table.getName());
  dc.setTableLocation(table, t);

  LOGGER.debug("2: " + t.getConnectionInfo().getAttributes());

}

Je reçois cette erreur : 'Fehler bei der Suche nach JNDI-Namen (UserY)'. Cela signifie que JRC ne peut pas trouver le nom JNDI donné.

Est-ce que quelqu'un connaît des changements entre ces versions de JRC? Et est-ce que quelqu'un connaît une solution?

1voto

Thomas Zuberbühler Points 967

J'ai trouvé le problème et une solution de contournement après une longue session de débogage.

// exemple de code incomplet

for(Object table : db.getTables()) {

  ITable t = (ITable)((ITable)table).clone(true);
  System.out.println(t.getName());

  // en modifiant t, bag est une instance existante de la classe PropertyBag
  t.getConnectionInfo().setAttributes(bag);

  // dc est une instance existante de DatabaseController
  dc.setTableLocation((ITable)table, t)

}

db.getTables() contient 3 tables A, B et C. Si nous exécutons le code ci-dessus, System.out imprime A, A, B dans la console.

Si nous commentons dc.setTableLocation((ITable)table, t), A, B, C seront imprimés. Je suppose que dc.setTableLocation((ITable)table, t) modifie internalement la liste des tables.

Nous utilisons le contournement suivant:

// exemple de code incomplet

// CODE DE CONTRE-ATTAQUE
Map oldNewMap = new HashMap();

for(Object table : db.getTables()) {

  ITable t = (ITable)((ITable)table).clone(true);
  System.out.println(t.getName());

  // en modifiant t, bag est une instance existante de la classe PropertyBag
  t.getConnectionInfo().setAttributes(bag);

  // CODE DE CONTRE-ATTAQUE
  oldNewMap.put((ITable)table, t);

}

// CODE DE CONTRE-ATTAQUE
for (Entry e : oldNewMap.entrySet()) {
  dc.setTableLocation(e.getKey(), e.getValue());
}

J'espère que quelqu'un économisera du temps et de l'argent avec ce contournement. ;-) Je l'ai également publié sur le forum officiel.

Forum: Développement Java - Crystal Reports

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X