2009-03-30 37 views
169

Với java.sql.ResultSet có cách nào để lấy tên cột là String bằng cách sử dụng chỉ mục của cột không? Tôi đã xem qua tài liệu API nhưng tôi không thể tìm thấy bất kỳ thứ gì.Lấy tên cột từ java.sql.ResultSet

Trả lời

290

Bạn có thể nhận thông tin này từ siêu dữ liệu ResultSet. Xem ResultSetMetaData

ví dụ:

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

và bạn có thể lấy tên cột từ đó. Nếu bạn làm

select x as y from table 

thì rsmd.getColumnLabel() cũng sẽ lấy cho bạn tên nhãn được truy xuất.

+14

Xem thêm 'rsmd.getColumnLabel' nếu bạn lấy cột có nhãn (ví dụ' CHỌN ColumnName AS ColumnLabel' – T30

+2

@ T30 - đó là rất hữu ích và tôi đã sửa đổi câu trả lời của tôi để phản ánh nhận xét của bạn –

+8

Bạn có thể ngạc nhiên khi thấy số cột bắt đầu từ 1. Bạn có thể lặp qua các tên cột với tên chuỗi 'for (int i = 1; i <= rsmd.getColumnCount(); i ++) = rsmd.getColumnName (i); ' – Alphaaa

16

Bạn có thể sử dụng các đối tượng ResultSetMetaData (http://java.sun.com/javase/6/docs/api/java/sql/ResultSetMetaData.html) cho rằng, như thế này:

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

thanx nó đã giúp tôi ... tôi sử dụng nó như là: resultSet.getString (resultSet.findColumn ("fullname")) –

116

Ngoài các câu trả lời ở trên, nếu bạn đang làm việc với một truy vấn năng động và bạn muốn các tên cột nhưng không biết có bao nhiêu cột, bạn có thể sử dụng đối tượng ResultSetMetaData để lấy số cột đầu tiên và sau đó quay vòng qua chúng.

Ammending đang 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 
} 
+0

không phải là điều này phải không? cho (int i = 1; i <= columnCount + 1; i ++) {...} – Martin

+3

@Martin Không, vì điều đó sẽ cố gắng lấy Cột n + 1 không tồn tại. Nếu bạn muốn hoàn toàn súc tích, thì nó sẽ là 'i <= columnCount'. – Cyntech

1

Các câu lệnh SQL mà đọc dữ liệu từ một truy vấn cơ sở dữ liệu trả lại dữ liệu trong một tập kết quả. Câu lệnh SELECT là cách tiêu chuẩn để chọn các hàng từ một cơ sở dữ liệu và xem chúng trong một tập kết quả. Giao diện **java.sql.ResultSet** đại diện cho tập kết quả của truy vấn cơ sở dữ liệu.

  • phương pháp Nhận: sử dụng để xem các dữ liệu trong các cột của hàng hiện tại được trỏ đến bởi con trỏ.

Sử dụng 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

và hơn nữa để ràng buộc nó vào mô hình dữ liệu bảng

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 

rất đẹp hướng dẫn ở đây: 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); 
7

Câu hỏi này cũ và các câu trả lời chính xác trước đó. Nhưng những gì tôi đang tìm kiếm khi tôi tìm thấy chủ đề này là một cái gì đó giống như giải pháp này. Hy vọng nó giúp ai đó.

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

    } 
    } 
} 
0

@Cyntech là đúng.

Trong trường hợp bảng của bạn là trống rỗng và bạn vẫn cần phải nhận được tên cột bảng bạn có thể nhận được cột as type Vector, thấy như sau:

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

Bảng Tên: người Dòng DataType id VARCHAR cname VARCHAR dob NGÀY

0

Khi bạn cần đồng tên lumn, nhưng không muốn để lấy mục:

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

LƯU Ý: Chỉ làm việc với MySQL

3

SQLite 3

Sử dụng 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: này làm việc với PostgreSQL cũng

Các vấn đề liên quan