2014-07-24 13 views
12

Wie schreibe ich eine ganze Tabelle in eine flache Datei mit JDBC? Bisher habe ich folgendes versucht:Wie erhalten Sie Werte aus allen Spalten mit ResultSet.getBinaryStream() in jdbc?

Statement statement = connection.createStatement(); 
    ResultSet result = statement.executeQuery("SELECT * FROM tablename"); 
    BufferedInputStream buffer; 
    FileOutputStream out = new FileOutputStream("flatfile.txt"); 
    while(result.next()) 
    { 
     buffer = new BufferedInputStream(result.getBinaryStream("????")); 
     byte[] buf = new byte[4 * 1024]; //4K buffer 
     int len; 
     while((len = buffer.read(buf, 0, buf.length)) != -1) 
     { 
      out.write(buf, 0, len); 
     } 
    } 
    out.close(); 

"????" ist nur mein Platzhalter. Ich stecke fest, was ich als Argument weitergeben kann.

+0

Was ist Ihre Frage? –

+0

Ersetzen Sie einfach "????" Mit "" um alle Spalten zu erhalten oder gibt es eine andere Funktion in ResultSet oder eine andere Klasse, um eine ganze Zeile zu erhalten? Ich will nur die ganze Reihe. Nicht nur eine Spalte dieses Datensatzes. Ich habe noch keine db-Konnektivität zum Testen, also versuche ich es nur im Voraus herauszufinden, also bin ich bereit. – HarishV

+2

'ResultSet' bietet keine Methoden, die sich mit der gesamten Zeile befassen. Sie müssen mit Spalten einzeln umgehen. Möglicherweise ist die Methode [getMetaData()] (http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getMetaData---) hilfreich. – GriffeyDog

Antwort

20

Sie alle Spaltennamen erhalten können verwendet werden und die gesamten Daten aus Ihrer Tabelle unter Verwendung des Codes. writeToFile Methode wird die Logik enthalten, um die Datei zu schreiben (wenn das nicht offensichtlich genug :) war)

ResultSetMetaData metadata = rs.getMetaData(); 
    int columnCount = metadata.getColumnCount();  
    for (int i = 1; i <= columnCount; i++) { 
     writeToFile(metadata.getColumnName(i) + ", ");  
    } 
    System.out.println(); 
    while (rs.next()) { 
     String row = ""; 
     for (int i = 1; i <= columnCount; i++) { 
      row += rs.getString(i) + ", ";   
     } 
     System.out.println(); 
     writeToFile(row); 

    } 
+1

ah, schade, es gibt keine ResultSet.getRow Methode! –

1

result.getBinaryStream("????") wird nur für den Wert für diese Spalte zurückgeben, wie Sie als Platzhalter setzen.

Wenn Sie die ganze Spalte erhalten möchten, müssen Sie ResultSetMetaData von ResultSet

ResultSetMetaData metadata = resultSet.getMetaData(); 
    int columnCount = metadata.getColumnCount(); 
    for (int i=1; i<=columnCount; i++) 
    { 
     String columnName = metadata.getColumnName(i); 
     System.out.println(columnName); 
    } 
+0

Vielen Dank sendon1982, ich denke, ich kann dies verwenden, um jede Spalte in der Tabelle mit getBinaryCount() zu durchlaufen und nur den Spaltenindex zu übergeben, um die gesamte Tabelle auszudrucken. Ich fragte mich, ob es einen Weg gäbe, einen ganzen Tisch mit einer einzigen Funktion auszuspucken, aber das wird reichen. – HarishV

+0

Gern geschehen. Nein, Sie müssen Schleife verwenden, um sie nacheinander anzuzeigen. – sendon1982

1

Hier ist, wie ich eine Tabelle aus einer JDBC-Verbindung Dump, sehr nützlich für das Debuggen, wenn Sie alle Zeilen sehen möchten , die in einem Speicher (ex: HSQL) DB zum Beispiel:

public static void spitOutAllTableRows(String tableName, Connection conn) { 
    try { 
     System.out.println("current " + tableName + " is:"); 
     try (PreparedStatement selectStmt = conn.prepareStatement(
       "SELECT * from " + tableName, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
      ResultSet rs = selectStmt.executeQuery()) { 
     if (!rs.isBeforeFirst()) { 
      System.out.println("no rows found"); 
     } 
     else { 
      while (rs.next()) { 
      for (int i = 1; i < rs.getMetaData().getColumnCount() + 1; i++) { 
       System.out.print(" " + rs.getMetaData().getColumnName(i) + "=" + rs.getObject(i)); 
      } 
      System.out.println(""); 
      } 
     } 
     } 
    } 
    catch (SQLException e) { 
     throw new RuntimeException(e); 
    } 
    } 

Ausgang ist wie

current <yourtablename> is: 
ID=1 COLUMN1=abc COLUMN2=null 
ID=2 COLUMN1=def COLUMN2=ghi 
...