2014-07-24 38 views
12

Jak napisać CAŁĄ tabelę do płaskiego pliku przy użyciu jdbc? Do tej pory próbowałem wykonać następujące czynności:Jak uzyskać wartości ze wszystkich kolumn przy użyciu ResultSet.getBinaryStream() w 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(); 

"????" to tylko mój symbol zastępczy. Utknąłem na tym, co można przekazać jako argument.

+0

Jakie jest Twoje pytanie? –

+0

Czy po prostu zastępuję "????" z "" aby uzyskać wszystkie kolumny lub czy istnieje inna funkcja w ResultSet lub jakiejś innej klasie, aby uzyskać cały wiersz? Chcę tylko całego rzędu. Nie tylko jedna kolumna tej płyty. Nie mam jeszcze łączności z dbem, aby przetestować, więc próbuję to wcześniej ustalić, więc jestem gotowy. – HarishV

+2

'ResultSet' nie dostarcza metod, które dotyczą całego wiersza. Musisz radzić sobie z kolumnami indywidualnie. Przydatna może być metoda [getMetaData()] (http://docs.oracle.com/javase/8/docs/api/java/sql/ResultSet.html#getMetaData--). – GriffeyDog

Odpowiedz

20

można uzyskać wszystkie nazwy kolumn i cały dane z tabeli za pomocą poniższego kodu. metoda WriteToFile będzie zawierać logikę do pisania do pliku (jeśli to nie było wystarczająco oczywiste :))

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, szkoda, że ​​nie ma metody ResultSet.getRow! –

1

result.getBinaryStream("????") powróci tylko dla wartości dla tej kolumny, gdy wstawisz jako symbol zastępczy.

Jeśli chcesz, aby wszystkie kolumny, należy użyć ResultSetMetaData z 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

Dziękuję sendon1982, myślę, że mogę użyć tego do przechodzenia przez każdą kolumnę w tabeli za pomocą getBinaryCount() i po prostu przekazać w indeksie kolumny, aby wydrukować całą tabelę. Zastanawiałem się, czy istnieje sposób, żeby wypluć cały stół z jedną funkcją, ale to wystarczy. – HarishV

+0

Nie ma za co. Nie, musisz użyć pętli, aby wyświetlić je jeden po drugim. – sendon1982

1

Oto jak zrzucić tabelę z połączenia JDBC, bardzo przydatna do debugowania, jeśli chcesz zobaczyć wszystkie wiersze które znajdują się w pamięci (np HSQL) dB na przykład:

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); 
    } 
    } 

wyjście jest jak

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