Java.sql.ResultSet öğesinden sütun adlarını alma


233

İle java.sql.ResultSetbir gibi bir sütunun adını almak için bir yolu yoktur Stringsütunun dizini kullanarak? API belgesine bir göz attım ama hiçbir şey bulamıyorum.

Yanıtlar:


372

Bu bilgiyi ResultSetmeta verilerden alabilirsiniz. ResultSetMetaData'ya bakın

Örneğin

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

ve sütun adını oradan alabilirsiniz. Yaparsan

select x as y from table

sonra rsmd.getColumnLabel()geri alınan etiket adını da alırsınız.


22
Ayrıca rsmd.getColumnLabeletiketli sütunları alıp almayacağınıza da bakın (örneğinSELECT columnName AS ColumnLabel
T30

15
1'den başlayan sütun sayısını for (int i = 1; i <= rsmd.getColumnCount(); i++) String name = rsmd.getColumnName(i);
gördüğümde şaşırabilirsiniz.

Does getColumnName()kullanılmıyorsa orijinal sütun adını döndürür ASadlandırma takma?
memberound

2
@membersound Evet, Javadoc öğesinde belgelendiği gibi : "Bir SQL ASbelirtilmezse, döndürülen getColumnLabeldeğer getColumnNameyöntem tarafından döndürülen değerle aynı olur ." . Hemen hemen her durumda getColumnLabelyerine kullanmalısınız getColumnName.
Mark Rotteveel

1
Tablo boşsa bu başarısız olur.
andronix

140

Yukarıdaki yanıtlara ek olarak, dinamik bir sorgu ile çalışıyorsanız ve sütun adlarını istiyorsanız, ancak kaç sütun olduğunu bilmiyorsanız, önce sütun sayısını almak ve sonra bunlar arasında dolaşmak için ResultSetMetaData nesnesini kullanabilirsiniz. .

Brian'ın kodunu değiştirme:

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
}

doğru değil mi for (int i = 1; i <= columnCount + 1; i ++) {...}
Martin

3
@Martin Hayır, çünkü bu var olmayan n + 1 Sütununu almaya çalışacaktır. Kesinlikle özlü olmak istiyorsanız, o zaman olurdu i <= columnCount.
Cyntech

21

Bunun için ResultSetMetaData ( http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html ) nesnesini şu şekilde kullanabilirsiniz:

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

1
thanx bana yardımcı oldu ... i olarak kullandım: sonuçSet.getString (sonuçSet.findColumn ("tam ad"))
C Keskin

Alınan kayıtları 1 ile sınırlayın. Aksi takdirde tablo çok büyükse gereksiz ek yük olur. Teradatabase için: "SELECT * FROM table SAMPLE 1" sorgusunu kullanın
josepainumkal

11

Bu soru eski ve önceki cevaplar da doğru. Ama bu konuyu bulduğumda aradığım şey bu çözüm gibi bir şeydi. Umarım birine yardımcı olur.

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

GetMetaData () işlevini kullanma;

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: Bu PostgreSQL ile de çalışır


Bir teradata veritabanında denedim ve "[Teradata Veritabanı] [TeraJDBC 16.20.00.02] [Hata 9719] [SQLState HY000] QVCI özelliği devre dışı." Hatası aldı.
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);
        }
    }
}

Tablo Adı: kişi Alan DataType id VARCHAR cname VARCHAR dob DATE


1

Sütun adlarına ihtiyacınız olduğunda, ancak girişleri kapmak istemediğinizde:

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

NOT: Yalnızca MySQL ile çalışır


1
Sadece bu benim için çalıştı !!. Bunun için aşağı inmek zorunda kaldı. GetColumnName (i) & getColumnLabel (i) neden beklenmedik garip verileri aldım. Çok teşekkürler!
VipiN Negi

Bunun sana yardım ettiğine sevindim!
Hunter S

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

6
Lütfen, cevabınızı daha ayrıntılı bir açıklama ile uzatabilir misiniz? Bu anlayış için çok faydalı olacaktır. Teşekkür ederim!
vezunchik

1

Veritabanı sorgusundan veri okuyan SQL deyimleri, sonuç kümesindeki verileri döndürür. SELECT ifadesi, bir veritabanından satır seçmenin ve bunları bir sonuç kümesinde görüntülemenin standart yoludur. **java.sql.ResultSet**Arayüz, bir veritabanı sorgu sonuç kümesini temsil eder.

  • Yöntemleri al: imlecin işaret ettiği geçerli satırın sütunlarındaki verileri görüntülemek için kullanılır.

kullanma 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

ve daha fazlasını veri modeli tablosuna bağlamak için

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

burada çok güzel bir öğretici: 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 haklı.

Tablonuz boşsa ve yine de sütun sütun isimlerini almanız gerekiyorsa, sütununuzu Vector türü olarak alabilirsiniz, aşağıdakilere bakın:

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

Spring jdbctemplate kullanmak istiyorsanız ve bağlantı personeliyle uğraşmak istemiyorsanız, aşağıdakileri kullanabilirsiniz:

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 sonuç adı ve sütununu ve sonuçSet.getMetaData () alabilirsiniz; Bu kod benim için çalışıyor:

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

Biliyorum, bu soru zaten cevaplandı, ancak muhtemelen benim gibi birisinin DatabaseMetaDatadizin yerine etikete göre bir sütun adına erişmesi gerekiyor :

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");
        }
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.