2012-09-11 28 views
20

Tôi có một ResultSet trả về dữ liệu của các loại khác nhau. Truy vấn được xây dựng động, do đó, tại thời gian biên dịch, tôi không biết loại giá trị truy vấn sẽ trả về.Làm thế nào tôi có thể nhận được các kiểu dữ liệu khác nhau từ ResultSetMetaData trong Java?

Tôi đã viết mã sau giả định rằng tất cả các kết quả là Chuỗi. Nhưng tôi cũng muốn có được từng loại giá trị. Tôi có thể làm cái này như thế nào?

Dưới đây là mã tôi đã viết.

while (reportTable_rst.next()) { 
    String column = reportTable_rst.getString(columnIterator); 
} 

Tại thời điểm này, tôi muốn nhận loại cột và nhận giá trị theo loại dữ liệu.

+0

Xin chào tất cả. Đây là thông tin cho khách truy cập trong tương lai. Nếu yêu cầu của bạn là lấy giá trị trường không phụ thuộc vào kiểu dữ liệu của cột đó, bạn có thể sử dụng phương thức getObject của phương thức resultSet và setObject của PreparedStatement trong khi chèn. Đây là một ví dụ. 'While (rsdata.next()) \t \t { \t \t \t for (int i = 0; i learner

Trả lời

30

Các ResultSetMetaData.getColumnType(int column) trả về một giá trị int xác định loại cột được tìm thấy trong java.sql.Types.

Ví dụ:

Connection connection = DriverManager.getConnection(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD); 
PreparedStatement statement = connection.prepareStatement(JDBC_SELECT); 
ResultSet rs = statement.executeQuery(); 
PrintStream out = System.out; 

if (rs != null) { 
    while (rs.next()) { 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     for (int i = 1; i <= rsmd.getColumnCount(); i++) { 
      if (i > 1) { 
      out.print(","); 
      } 

      int type = rsmd.getColumnType(i); 
      if (type == Types.VARCHAR || type == Types.CHAR) { 
       out.print(rs.getString(i)); 
      } else { 
       out.print(rs.getLong(i)); 
      } 
     } 

     out.println(); 
    } 
} 
+0

Câu trả lời hay. Có lẽ nitpicking, nhưng một câu hỏi: tại sao lấy đối tượng * ResultSetMetaData * bên trong một vòng lặp 'while'? Ý tôi là nó vẫn giống nhau, tên cột và kiểu của chúng cũng giống nhau. Bạn chỉ có thể lấy đối tượng * ResultSetMetaData * ** một lần, trước ** vòng lặp 'while'. – informatik01

+0

Nếu không lặp lại 'ResultSet', bạn sẽ gặp phải một ngoại lệ như vậy:' java.sql.SQLException: Vị trí con trỏ không hợp lệ.'. Lặp lại di chuyển con trỏ theo hướng được chỉ định hoặc 'FORWARD' theo mặc định. –

+0

Tất nhiên tôi biết bạn phải sử dụng 'rs.next()' để lặp lại/chuyển sang hàng kế tiếp. Tôi đã nói về ** ResultSetMetaData ** đối tượng, đó là ** cùng ** và không cần phải được lặp đi lặp lại. Vì vậy, bạn có thể dễ dàng truy xuất đối tượng ** ResultSetMetaData ** ** chỉ một lần **, trước khi vào vòng lặp 'while' và nó sẽ không cung cấp cho bạn bất kỳ ngoại lệ nào. – informatik01

3

Bạn có thể gọi,

Để trả về loại SQL của cột được chỉ định.

int ResultSetMetaData.getColumnType(int column)

Để trở về định loại tên cơ sở dữ liệu cụ thể cột của.

String ResultSetMetaData.getColumnTypeName(int column)

3
ResultSet rs; 
int column; 
..... 
ResultSetMetaData metadata = rs.getMetaData(); 
metadata.getColumnTypeName(column); // database specific type name 
metadata.getColumnType(column); // returns the SQL type 
1

Tôi nghĩ câu trả lời ở trên sẽ không trong vòng lặp và có một số thiếu chi tiết. Đoạn mã này có thể cải thiện để chỉ hiển thị Tên cột và kiểu dữ liệu tương ứng. Đây là mã hoàn toàn hoạt động

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.ResultSetMetaData; 
import java.sql.SQLException; 

public class Test { 

    private static final String DRIVER = "com.mysql.jdbc.Driver"; 
    private static final String HOST = "192.168.56.101"; 
    private static final String PORT = "3316"; 
    private static final String CONNECTION_URL = "jdbc:mysql://"+HOST+":"+PORT+"/"; 
    private static final String USERNAME = "user"; 
    private static final String PASSWORD = "pwd"; 
    private static final String DATABASE = "db"; 
    private static final String TABLE = "table"; 
    private static final String QUERY = "select * from "+DATABASE+"."+TABLE+" where 1=0"; 

    public static void main(String[] args) throws ClassNotFoundException, SQLException { 
     Class.forName(DRIVER); 
     Connection con = DriverManager.getConnection (CONNECTION_URL , USERNAME, PASSWORD); 
     ResultSet rs = con.createStatement().executeQuery(QUERY); 
     if (rs != null) { 
      System.out.println("Column Type\t\t Column Name"); 

       ResultSetMetaData rsmd = rs.getMetaData(); 
       for (int i = 1; i <= rsmd.getColumnCount(); i++) { 
        System.out.println(rsmd.getColumnTypeName(i)+"\t\t\t"+rsmd.getColumnName(i)); 
      } 
     } 
    } 
} 
Các vấn đề liên quan