2017-06-22 2 views
0

ich den Java-Code-Schnipsel haben:eine Abfragetabelle generieren gelingt in Coldfusion aber nicht in Java

import coldfusion.runtime.Struct; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import oracle.jdbc.OracleCallableStatement; 

public class CursorTest { 
    public static Struct getCursor() throws SQLException { 
    OracleCallableStatement statement = null; 
    Struct variables = new Struct(); 
    // prepare statement with a cursor out parameter 
    ResultSet results = statement.getCursor(1); 
    variables.put ("cursor", results); 
    return variables; 
    } 
} 

Einschließlich der cfusion.jar und den Hotfix Gläser aus dem Coldfusion lib Directoy und Oracle ojdbc6.jar in den Build-Pfad.

Ich kann es in Coldfusion laufen:

<cfscript> 
    vars = createObject('java', 'CursorTest').getCursor(); 
    cursor = createObject('java', 'coldfusion.sql.QueryTable') 
      .init(vars.cursor) 
      .firstTable(); 
    WriteDump(cursor); 
    // close the statement and connection. 
</cfscript> 

Dies funktioniert und die QueryTable erstellt wird.

jedoch versucht, die Erzeugung des QueryTable in den Java-Code zu verschieben:

import coldfusion.runtime.Struct; 
import coldfusion.sql.QueryTable; 
import coldfusion.sql.Table; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import oracle.jdbc.OracleCallableStatement; 

public class CursorTest { 
    public static Struct getCursor() throws SQLException { 
    OracleCallableStatement statement = null; 
    Struct variables = new Struct(); 
    // prepare statement with a cursor out parameter 
    ResultSet results = statement.getCursor(1); 
    Table table = new QueryTable(results).firstTable(); 
    variables.put ("cursor", table); 
    return variables; 
    } 
} 

mit aufzubauen schlägt fehl:

error: cannot access QueryTableWrapper 
     Table table = new QueryTable(results).firstTable(); 
        ^
    class file for coldfusion.runtime.QueryTableWrapper not found 

Nun ist der Fehler selbsterklärend und Auspacken der Jar-Dateien zeigt, dass diese Datei nicht vorhanden ist ... Ich kann sie jedoch nicht in den anderen Jar-Dateien finden, die sich im ColdFusion-Lib-Verzeichnis, im ColdFusion-JRE-Verzeichnis oder in anderen Jars befinden, die sich im ColdFusion-Klassenpfad befinden.

Weiß jemand, wo diese Datei liegt, damit ich sie in den Build-Pfad aufnehmen kann, oder alternativ, wie ColdFusion die QueryTable mit createObject ohne diesen Wrapper erzeugt?

+0

Versuchen Sie, ColdFusion-Bibliotheken im Kontext einer Java-Anwendung aufzurufen? –

+0

@ AdrianJ.Moreno Das Gegenteil, Java-Code in einer ColdFusion-Anwendung verwenden. – MT0

+0

Es wird wahrscheinlich versucht, eine ColdFusion "neu" im Gegensatz zu einer Java "neu" zu machen. Könnte sein? –

Antwort

1

coldFusion.sql.QueryTable hat mehrere Konstruktoren:

  • QueryTable()
  • QueryTable(Query cfx)
  • QueryTable(QueryTable rs)
  • QueryTable(QueryTableWrapper qtWrapper)
  • QueryTable(ResultSet rs)
  • QueryTable(int rows)
  • QueryTable(QueryTable rs, int maxrows)
  • QueryTable(int rows, String collist)
  • QueryTable(int rows, String[] cols)
  • QueryTable(int rows, String[] cols, String[] sqlColTypeNames)
  • QueryTable(int rows, String[] cols, String[] sqlColTypeNames, int[] sqlColTypes)

Die ersten 7 Konstrukteure dort alle Gebrauch aufgelistet, irgendwo unter der Oberfläche, QueryTableWrapper und in Java nicht wie die Klasse nicht gefunden .

QueryTable(int rows, String[] cols, String[] sqlColTypeNames, int[] sqlColTypes) verwendet jedoch diesen Wrapper nicht.

Also, wenn Sie nicht in einem ResultSet, Query oder eine bestehende QueryTable und haben es automatisch analysiert durch den Konstruktor übergeben kann, können Sie eine leere QueryTable erzeugen und dann den ResultSet analysieren und fügen Sie die Zeile-für-Zeile an die QueryTable wie folgt aus:

final OracleResultSet results = statement.getCursor(1); 
final ResultSetMetaData metadata = results.getMetadata(); 
final int columns    = metadata.getColumnCount(); 
final String[] colNames   = new String[ columns ]; 
final String[] sqlColTypeNames = new String[ columns ]; 
final int[] sqlColTypes   = new int[ columns ]; 
final boolean[] caseSensitive = new boolean[ columns ]; 

for (int i = 1; i <= columns; i++) 
{ 
    colNames[i-1]  = metadata.getColumnName(i); 
    sqlColTypeNames[i-1] = metadata.getColumnTypeName(i); 
    sqlColTypes[i-1]  = metadata.getColumnType(i); 
    caseSensitive[i-1] = metadata.isCaseSensitive(i); 
} 
final QueryTable table = new QueryTable(
    0, 
    colNames, 
    sqlColTypeNames, 
    sqlColTypes 
); 
table.getMeta().setColumnCase(caseSensitive); 

int rows = 0; 
while (results.next()) 
{ 
    table.addRows(1); 
    ++rows; 
    for (int c = 1; c <= columns; ++c) 
    { 
    Object value = null; 
    switch(sqlColTypes[c-1]) 
    { 
     case OracleTypes.ARRAY: value = results.getARRAY(c).getArray(); 
           break; 
     case OracleTypes.VARCHAR: value = results.getString(c); 
           break; 
     case OracleTypes.DATE: value = results.getDate(c); 
           break; 
     case OracleTypes.NUMERIC: value = results.getBigDecimal(c); 
           break; 
     // Add other types 
     default:    throw new UnsupportedOperationException("Unable to handle: " + sqlColTypes[c-1]); 
    } 
    if (results.wasNull()) 
    { 
     value = null; 
    } 
    table.setField(rows, c, value); 
    } 
} 

die QueryTable.firstTable() kann dann zurück in Coldfusion und verwendet zurückgegeben werden, als ob es ein Abfrageergebnis durch eine der integrierten Coldfusion-Funktionen generiert wurde.

Verwandte Themen