web-dev-qa-db-fra.com

Comment obtenez-vous des valeurs de toutes les colonnes en utilisant ResultSet.getBinaryStream () dans jdbc?

Comment puis-je écrire une table entière dans un fichier plat (fichier texte) à l'aide de jdbc? Jusqu'à présent, j'ai tenté ce qui suit:

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

"????" est juste mon espace réservé. Je suis coincé sur ce qu'il faut transmettre comme argument.

16
Harish Vangavolu

Vous pouvez obtenir tous les noms de colonne et toutes les données de votre table en utilisant le code ci-dessous . La méthode writeToFile contiendra la logique pour écrire dans un fichier (si cela n'était pas assez évident :)) 

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

    }
27
Adarsh

Voici comment je vider une table d'une connexion JDBC, très utile pour le débogage si vous souhaitez voir toutes les lignes qui se trouvent dans une base de données en mémoire (ex: HSQL), par exemple:

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

la sortie est comme

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

result.getBinaryStream("????") ne renverra que la valeur de cette colonne lorsque vous aurez placé un paramètre fictif.

Si vous voulez obtenir toute la colonne, vous devez utiliser ResultSetMetaData à partir de 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);
    }
1
sendon1982