web-dev-qa-db-fra.com

Récupérer les noms de colonne de Java.sql.ResultSet

Avec Java.sql.ResultSet, existe-t-il un moyen d'obtenir le nom d'une colonne sous la forme d'un String en utilisant l'index de la colonne? J'ai jeté un coup d'œil à la documentation de l'API mais je ne trouve rien.

211
Ben

Vous pouvez obtenir cette information à partir des métadonnées ResultSet. Voir ResultSetMetaData

par exemple.

 ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
 ResultSetMetaData rsmd = rs.getMetaData();
 String name = rsmd.getColumnName(1);

et vous pouvez obtenir le nom de la colonne à partir de là. Si tu fais

select x as y from table

alors rsmd.getColumnLabel() vous donnera aussi le nom de l'étiquette récupérée.

337
Brian Agnew

Outre les réponses ci-dessus, si vous travaillez avec une requête dynamique et que vous souhaitez connaître le nom des colonnes sans savoir le nombre de colonnes, vous pouvez utiliser l'objet ResultSetMetaData pour obtenir le nombre de colonnes en premier, puis les parcourir. .

Amender le code de Brian:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

// The column count starts from 1
for (int i = 1; i <= columnCount; i++ ) {
  String name = rsmd.getColumnName(i);
  // Do stuff with name
}
135
Cyntech

Vous pouvez utiliser le ResultSetMetaData ( http://Java.Sun.com/javase/6/docs/api/Java/sql/ResultSetMetaData.html ) pour cela, comme ceci:

ResultSet rs = stmt.executeQuery("SELECT * FROM table");
ResultSetMetaData rsmd = rs.getMetaData();
String firstColumnName = rsmd.getColumnName(1);
20
simon

Cette question est ancienne, de même que les réponses précédentes correctes. Mais ce que je cherchais quand j'ai découvert que ce sujet ressemblait à cette solution. Espérons que cela aide quelqu'un.

// Loading required libraries    
import Java.util.*;
import Java.sql.*;

public class MySQLExample {
  public void run(String sql) {
    // JDBC driver name and database URL
    String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    String DB_URL = "jdbc:mysql://localhost/demo";

    // Database credentials
    String USER = "someuser"; // Fake of course.
    String PASS = "somepass"; // This too!

    Statement stmt = null;
    ResultSet rs = null;
    Connection conn = null;
    Vector<String> columnNames = new Vector<String>();

    try {
      // Register JDBC driver
      Class.forName(JDBC_DRIVER);

      // Open a connection
      conn = DriverManager.getConnection(DB_URL, USER, PASS);

      // Execute SQL query
      stmt = conn.createStatement();
      rs = stmt.executeQuery(sql);
      if (rs != null) {
        ResultSetMetaData columns = rs.getMetaData();
        int i = 0;
        while (i < columns.getColumnCount()) {
          i++;
          System.out.print(columns.getColumnName(i) + "\t");
          columnNames.add(columns.getColumnName(i));
        }
        System.out.print("\n");

        while (rs.next()) {
          for (i = 0; i < columnNames.size(); i++) {
            System.out.print(rs.getString(columnNames.get(i))
                + "\t");

          }
          System.out.print("\n");
        }

      }
    } catch (Exception e) {
      System.out.println("Exception: " + e.toString());
    }

    finally {
      try {
        if (rs != null) {
          rs.close();
        }
        if (stmt != null) {
          stmt.close();
        }
        if (conn != null) {
          conn.close();
        }
      } catch (Exception mysqlEx) {
        System.out.println(mysqlEx.toString());
      }

    }
  }
}
10
Ronald Weidner

SQLite 3

Utilisation de getMetaData ();

DatabaseMetaData md = conn.getMetaData();
ResultSet rset = md.getColumns(null, null, "your_table_name", null);

System.out.println("your_table_name");
while (rset.next())
{
    System.out.println("\t" + rset.getString(4));
}

EDIT: Cela fonctionne aussi avec PostgreSQL

5
Sedrick
import Java.sql.*;

public class JdbcGetColumnNames {

    public static void main(String args[]) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            Class.forName("com.mysql.jdbc.Driver");
            con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/komal", "root", "root");

            st = con.createStatement();

            String sql = "select * from person";
            rs = st.executeQuery(sql);
            ResultSetMetaData metaData = rs.getMetaData();

            int rowCount = metaData.getColumnCount();

            System.out.println("Table Name : " + metaData.getTableName(2));
            System.out.println("Field  \tDataType");

            for (int i = 0; i < rowCount; i++) {
                System.out.print(metaData.getColumnName(i + 1) + "  \t");
                System.out.println(metaData.getColumnTypeName(i + 1));
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}

Nom de la table: personne Champ id Type de données VARCHAR cname VARCHAR dob DATE

2
Deep Rathod

Les instructions SQL qui lisent des données à partir d'une requête de base de données renvoient les données dans un jeu de résultats. L'instruction SELECT est le moyen standard de sélectionner des lignes dans une base de données et de les afficher dans un jeu de résultats. L'interface **Java.sql.ResultSet** représente l'ensemble de résultats d'une requête de base de données.

  • Obtenir les méthodes: utilisé pour afficher les données dans les colonnes de la ligne en cours pointée par le curseur.

Utiliser MetaData of a result set to fetch the exact column count

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
     ResultSetMetaData rsmd = rs.getMetaData();
     int numberOfColumns = rsmd.getColumnCount();
     boolean b = rsmd.isSearchable(1);

http://docs.Oracle.com/javase/7/docs/api/Java/sql/ResultSetMetaData.html

et plus encore pour le lier à la table de modèle de données

   public static void main(String[] args) {
     Connection conn = null;
     Statement stmt = null;
     try{
      //STEP 2: Register JDBC driver
      Class.forName("com.mysql.jdbc.Driver");

      //STEP 3: Open a connection
      System.out.println("Connecting to a selected database...");
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      System.out.println("Connected database successfully...");

      //STEP 4: Execute a query
      System.out.println("Creating statement...");
      stmt = conn.createStatement();

      String sql = "SELECT id, first, last, age FROM Registration";
      ResultSet rs = stmt.executeQuery(sql);
      //STEP 5: Extract data from result set
      while(rs.next()){
         //Retrieve by column name
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         //Display values
         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
      }
      rs.close();
     }catch(SQLException se){
      //Handle errors for JDBC
      se.printStackTrace();
     }catch(Exception e){
      //Handle errors for Class.forName
      e.printStackTrace();
     }finally{
      //finally block used to close resources
      try{
         if(stmt!=null)
            conn.close();
      }catch(SQLException se){
      }// do nothing
      try{
         if(conn!=null)
            conn.close();
     }catch(SQLException se){
         se.printStackTrace();
       }//end finally try
     }//end try
      System.out.println("Goodbye!");
     }//end main
    }//end JDBCExample

très beau tutoriel ici: http://www.tutorialspoint.com/jdbc/

ResultSetMetaData meta = resultset.getMetaData();  // for a valid resultset object after executing query

    Integer columncount = meta.getColumnCount();

    int count = 1 ; // start counting from 1 always

    String[] columnNames = null;

    while(columncount <=count){

    columnNames [i] = meta.getColumnName(i);

    }

    System.out.println (columnNames.size() ); //see the list and bind it to TableModel object. the to your jtbale.setModel(your_table_model);
1
danielad

Lorsque vous avez besoin des noms de colonne, mais que vous ne voulez pas saisir d'entrées:

PreparedStatement stmt = connection.prepareStatement("SHOW COLUMNS FROM `yourTable`");

ResultSet set = stmt.executeQuery();

//store all of the columns names
List<String> names = new ArrayList<>();
while (set.next()) { names.add(set.getString("Field")); }

NOTE: Ne fonctionne qu'avec MySQL

1
Hunter S
while (rs.next()) {
   for (int j = 1; j < columncount; j++) {
       System.out.println( rsd.getColumnName(j) + "::" + rs.getString(j));      
   }
}
1
Jagadish Chenna
ResultSet rsTst = hiSession.connection().prepareStatement(queryStr).executeQuery(); 
ResultSetMetaData meta = rsTst.getMetaData();
int columnCount = meta.getColumnCount();
// The column count starts from 1

String nameValuePair = "";
while (rsTst.next()) {
    for (int i = 1; i < columnCount + 1; i++ ) {
        String name = meta.getColumnName(i);
        // Do stuff with name

        String value = rsTst.getString(i); //.getObject(1);
        nameValuePair = nameValuePair + name + "=" +value + ",";
        //nameValuePair = nameValuePair + ", ";
    }
    nameValuePair = nameValuePair+"||" + "\t";
}
0
Rabi

@Cyntech a raison.

Si votre table est vide et que vous devez toujours obtenir les noms des colonnes de la table, vous pouvez obtenir votre colonne sous le type Vector, voir ce qui suit:

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();

Vector<Vector<String>>tableVector = new Vector<Vector<String>>(); 
boolean isTableEmpty = true;
int col = 0;

 while(rs.next())
    {
      isTableEmpty = false;  //set to false since rs.next has data: this means the table is not empty
       if(col != columnCount)
          {
            for(int x = 1;x <= columnCount;x++){
                 Vector<String> tFields = new Vector<String>(); 
                 tFields.add(rsmd.getColumnName(x).toString());
                 tableVector.add(tFields);
             }
            col = columnCount;
          }
     } 


      //if table is empty then get column names only
  if(isTableEmpty){  
      for(int x=1;x<=colCount;x++){
           Vector<String> tFields = new Vector<String>(); 
           tFields.add(rsmd.getColumnName(x).toString());
           tableVector.add(tFields);
        }
      }

 rs.close();
 stmt.close();

 return tableVector; 
0
21stking