Rufen Sie Spaltennamen aus java.sql.ResultSet ab


233

Gibt java.sql.ResultSetes eine Möglichkeit, den Namen einer Spalte Stringmithilfe des Spaltenindex als zu ermitteln? Ich habe das API-Dokument durchgesehen, kann aber nichts finden.

Antworten:


371

Sie können diese Informationen aus den ResultSetMetadaten erhalten. Siehe ResultSetMetaData

z.B

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

und Sie können den Spaltennamen von dort erhalten. Wenn Sie tun

select x as y from table

Dann rsmd.getColumnLabel()erhalten Sie auch den abgerufenen Markennamen.


22
Siehe auch, rsmd.getColumnLabelwenn Sie Spalten mit Beschriftungen abrufen (zum BeispielSELECT columnName AS ColumnLabel
T30

15
Sie werden überrascht sein, wenn ich for (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i);
sehe

Gibt getColumnName()den ursprünglichen Spaltennamen zurück, wenn keine ASAliasnamen verwendet werden?
Membersound

2
@membersound Ja, wie in Javadoc dokumentiert : "Wenn kein SQL ASangegeben ist, entspricht der von zurückgegebene getColumnLabelWert dem von der getColumnNameMethode zurückgegebenen Wert ." . In fast allen Fällen sollten Sie getColumnLabelanstelle von verwenden getColumnName.
Mark Rotteveel

1
Dies schlägt fehl, wenn die Tabelle leer ist.
Andronix

140

Wenn Sie mit einer dynamischen Abfrage arbeiten und die Spaltennamen möchten, aber nicht wissen, wie viele Spalten vorhanden sind, können Sie zusätzlich zu den obigen Antworten das ResultSetMetaData-Objekt verwenden, um zuerst die Anzahl der Spalten abzurufen und diese dann zu durchlaufen .

Änderung von Brians Code:

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
}

ist das nicht richtig für (int i = 1; i <= columnCount + 1; i ++) {...}
Martin

3
@Martin Nein, da dadurch versucht wird, die nicht vorhandene Spalte n + 1 abzurufen. Wenn Sie absolut präzise sein wollen, dann ist es das auch i <= columnCount.
Cyntech

21

Sie können das ResultSetMetaData- Objekt ( http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html ) dafür wie folgt verwenden :

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

1
Danke, es hat mir geholfen ... ich habe es verwendet als: resultSet.getString (resultSet.findColumn ("fullname"))
C Sharper

Begrenzen Sie die abgerufenen Datensätze auf 1. Andernfalls, wenn die Tabelle zu groß ist, unnötiger Overhead. ZB für Teradatabase: Verwenden Sie die Abfrage "SELECT * FROM table SAMPLE 1"
josepainumkal

11

Diese Frage ist alt, ebenso wie die richtigen vorherigen Antworten. Aber was ich suchte, als ich dieses Thema fand, war so etwas wie diese Lösung. Hoffentlich hilft es jemandem.

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

    }
  }
}

5

SQLite 3

Verwenden von 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: Dies funktioniert auch mit PostgreSQL


Versuchte es in einer Teradata-Datenbank und bekam den Fehler "[Teradata-Datenbank] [TeraJDBC 16.20.00.02] [Fehler 9719] [SQLState HY000] QVCI-Funktion ist deaktiviert."
Josepainumkal

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

Tabellenname: Person Feld Datentyp ID VARCHAR cname VARCHAR dob DATE


1

Wenn Sie die Spaltennamen benötigen, aber keine Einträge abrufen möchten:

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

HINWEIS: Funktioniert nur mit MySQL


1
Nur das hat bei mir funktioniert !!. Musste dafür weit runter kommen. Ich bin mir nicht sicher, warum getColumnName (i) und getColumnLabel (i) mir unerwartete seltsame Daten abgerufen haben. Danke vielmals!
VipiN Negi

Ich bin froh, dass dir das geholfen hat!
Hunter S

1
while (rs.next()) {
   for (int j = 1; j < columncount; j++) {
       System.out.println( rsd.getColumnName(j) + "::" + rs.getString(j));      
   }
}

6
Können Sie bitte Ihre Antwort mit einer detaillierteren Erklärung erweitern? Dies ist sehr nützlich für das Verständnis. Danke dir!
Vezunchik

1

Die SQL-Anweisungen, die Daten aus einer Datenbankabfrage lesen, geben die Daten in einer Ergebnismenge zurück. Die SELECT-Anweisung ist die Standardmethode, um Zeilen aus einer Datenbank auszuwählen und in einer Ergebnismenge anzuzeigen. Die **java.sql.ResultSet**Schnittstelle repräsentiert die Ergebnismenge einer Datenbankabfrage.

  • Get-Methoden: Dient zum Anzeigen der Daten in den Spalten der aktuellen Zeile, auf die der Cursor zeigt.

Verwenden von 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

und weiter, um es an die Datenmodelltabelle zu binden

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

sehr schönes Tutorial hier: 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);

0

@Cyntech ist richtig.

Wenn Ihre Tabelle leer ist und Sie noch Tabellenspaltennamen abrufen müssen, können Sie Ihre Spalte als Typ Vektor abrufen, siehe Folgendes:

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

Wenn Sie spring jdbctemplate verwenden möchten und sich nicht mit Verbindungspersonal befassen möchten, können Sie Folgendes verwenden:

jdbcTemplate.query("select * from books", new RowCallbackHandler() {
        public void processRow(ResultSet resultSet) throws SQLException {
            ResultSetMetaData rsmd = resultSet.getMetaData();
            for (int i = 1; i <= rsmd.getColumnCount(); i++ ) {
                String name = rsmd.getColumnName(i);
                // Do stuff with name
            }
        }
    });

0

U kann Spaltennamen und -wert von resultSet.getMetaData () abrufen. Dieser Code funktioniert für mich:

Connection conn = null;
PreparedStatement preparedStatement = null;
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = MySQLJDBCUtil.getConnection();
        preparedStatement = conn.prepareStatement(sql);
        if (params != null) {
            for (int i = 0; i < params.size(); i++) {
                preparedStatement.setObject(i + 1, params.get(i).getSqlValue());
            }
            ResultSet resultSet = preparedStatement.executeQuery();
            ResultSetMetaData md = resultSet.getMetaData();
            while (resultSet.next()) {
                int counter = md.getColumnCount();
                String colName[] = new String[counter];
                Map<String, Object> field = new HashMap<>();
                for (int loop = 1; loop <= counter; loop++) {
                    int index = loop - 1;
                    colName[index] = md.getColumnLabel(loop);
                    field.put(colName[index], resultSet.getObject(colName[index]));
                }
                rows.add(field);
            }
        }
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (preparedStatement != null) {
            try {
                preparedStatement.close();
            }catch (Exception e1) {
                e1.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    return rows;

0

Ich weiß, diese Frage ist bereits beantwortet, aber wahrscheinlich muss jemand wie ich auf einen Spaltennamen zugreifen DatabaseMetaData by label anstelle von index :

ResultSet resultSet = null;
DatabaseMetaData metaData = null;

    try {
        metaData  = connection.getMetaData();
        resultSet = metaData.getColumns(null, null, tableName, null);

        while (resultSet.next()){
            String name = resultSet.getString("COLUMN_NAME");
        }
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.