2016-03-24 53 views
2

我有一個使用複雜SQL編寫的Crystal報告,我試圖使用Crystal Report Java API調用該報告。此報告具有與其關聯的Command對象。CommandTable cystal報告錯誤

  1. 我加載報告並設置連接參數。
  2. 然後我嘗試將連接信息設置爲當前的JDBC配置文件。含義測試環境證書。

我得到一個異常。我嘗試使用版本11。他們似乎都沒有工作。

我在調用下面的一段代碼時收到異常。對於沒有「Command」sqls的報告,這段代碼工作得很好。

try{ 
    clientDoc.getDatabaseController().setTableLocation(
    origTable, newTable); 
}catch(Exception ex){ 
    ex.printStackTrace(); 
} 

查看下面的完整代碼。如果有人知道如何解決這個問題,請回復。

private static void changeDataSource(ReportClientDocument clientDoc, 
     String reportName, String tableName, String username, 
     String password, String connectionURL, String driverName, 
     String jndiName) throws ReportSDKException { 

    PropertyBag propertyBag = null; 
    IConnectionInfo connectionInfo = null; 
    ITable origTable = null; 
    ITable newTable = null; 

    // Declare variables to hold ConnectionInfo values. 
    // Below is the list of values required to switch to use a JDBC/JNDI 
    // connection 
    String TRUSTED_CONNECTION = "false"; 
    String SERVER_TYPE = "JDBC (JNDI)"; 
    String USE_JDBC = "true"; 
    String DATABASE_DLL = "crdb_jdbc.dll"; 
    String JNDI_OPTIONAL_NAME = jndiName; 
    String CONNECTION_URL = connectionURL; 
    String DATABASE_CLASS_NAME = driverName; 

    // Declare variables to hold database User Name and Password values 
    String DB_USER_NAME = username; 
    String DB_PASSWORD = password; 
    System.out.println("Trusted_Connection:" + TRUSTED_CONNECTION); 
    System.out.println("Server Type:" + SERVER_TYPE); 
    System.out.println("Use JDBC:" + USE_JDBC); 
    System.out.println("Database DLL:" + DATABASE_DLL); 
    System.out.println("JNDIOptionalName:" + JNDI_OPTIONAL_NAME); 
    System.out.println("Connection URL:" + CONNECTION_URL); 
    System.out.println("Database Class Name:" + DATABASE_CLASS_NAME); 
    System.out.println("DB_USER_NAME:" + DB_USER_NAME); 
    System.out.println("DB_PASSWORD:" + DB_PASSWORD); 
    // Obtain collection of tables from this database controller 
    if (reportName == null || reportName.equals("")) { 
     Tables tables = clientDoc.getDatabaseController().getDatabase() 
       .getTables(); 
     for (int i = 0; i < tables.size(); i++) { 
      origTable = tables.getTable(i); 

      if (tableName == null || origTable.getName().equals(tableName)) { 
       newTable = (ITable) origTable; 
       newTable.setQualifiedName(origTable.getAlias()); 
       connectionInfo = newTable.getConnectionInfo(); 

       // Set new table connection property attributes 
       propertyBag = new PropertyBag(); 
       // Overwrite any existing properties with updated values 
       propertyBag.put("Trusted_Connection", TRUSTED_CONNECTION); 
       propertyBag.put("Server Type", SERVER_TYPE); 
       propertyBag.put("Use JDBC", USE_JDBC); 
       propertyBag.put("Database DLL", DATABASE_DLL); 
       propertyBag.put("JNDIOptionalName", JNDI_OPTIONAL_NAME); 
       propertyBag.put("Connection URL", CONNECTION_URL); 
       propertyBag.put("Database Class Name", DATABASE_CLASS_NAME); 
       connectionInfo.setAttributes(propertyBag); 
       connectionInfo.setUserName(DB_USER_NAME); 
       connectionInfo.setPassword(DB_PASSWORD); 

       // Update the table information 
       try{ 
        clientDoc.getDatabaseController().setTableLocation(
         origTable, newTable); 
       }catch(Exception ex){ 
        ex.printStackTrace(); 
       } 
      } 
     } 
    } 
    // Next loop through all the subreports and pass in the same 
    // information. You may consider 
    // creating a separate method which accepts 
    if (reportName == null || !(reportName.equals(""))) { 
     IStrings subNames = clientDoc.getSubreportController() 
       .getSubreportNames(); 
     for (int subNum = 0; subNum < subNames.size(); subNum++) { 
      Tables tables = clientDoc.getSubreportController() 
        .getSubreport(subNames.getString(subNum)) 
        .getDatabaseController().getDatabase().getTables(); 
      for (int i = 0; i < tables.size(); i++) { 
       origTable = tables.getTable(i); 
       if (tableName == null 
         || origTable.getName().equals(tableName)) { 
        newTable = (ITable) origTable; 

        newTable.setQualifiedName(origTable.getAlias()); 
        // Change connection information properties 
        connectionInfo = newTable.getConnectionInfo(); 
        // Set new table connection property attributes 
        propertyBag = new PropertyBag(); 

        // Overwrite any existing properties with updated values 
        propertyBag.put("Trusted_Connection", 
          TRUSTED_CONNECTION); 
        propertyBag.put("Server Type", SERVER_TYPE); 
        propertyBag.put("Use JDBC", USE_JDBC); 
        propertyBag.put("Database DLL", DATABASE_DLL); 
        propertyBag.put("JNDIOptionalName", JNDI_OPTIONAL_NAME); 
        propertyBag.put("Connection URL", CONNECTION_URL); 
        propertyBag.put("Database Class Name", 
          DATABASE_CLASS_NAME); 
        connectionInfo.setAttributes(propertyBag); 
        connectionInfo.setUserName(DB_USER_NAME); 
        connectionInfo.setPassword(DB_PASSWORD); 

        // Update the table information 
        clientDoc.getSubreportController() 
          .getSubreport(subNames.getString(subNum)) 
          .getDatabaseController() 
          .setTableLocation(origTable, newTable); 
       } 
      } 
     } 
    } 
} 
+0

事情替換這個我忘了在這裏提到是,這份報告原本是使用ODBC連接創建並導致它。我從頭開始使用JDBC連接重新生成報表,它工作得很好。 CRJava API沒有任何問題。對不起,我希望這會幫助別人解決這個問題。 – user3656845

+0

你的意思是你刪除了setTableLocation部分,因爲你已經連接了正確的數據庫信息?或者你仍然在使用setTableLocation部分,但它現在可以工作,因爲它已經爲JDBC定義了? – Piro

回答

0

加入這一行你的

connectionInfo.setPassword(DB_PASSWORD); 
newTable.setConnectionInfo(connectionInfo); 
//This will add connection parameters to the new table 

而不是

clientDoc.getDatabaseController().setTableLocation(origTable, newTable); 

clientDoc.getDatabaseController().setTableLocation (newTable, tables.getTable(i)); 
+0

你能詳細說明它將如何幫助嗎?由於'origTable = tables.getTable(i);'首先,你是否說'setTableLocation'方法顛倒了新舊錶格參數?否則,你沒有取代任何東西,所以它當然不會失敗。 – Piro