2012-09-11 58 views
20

我有一個ResultSet返回不同類型的數據。查詢是動態構造的,所以在編譯時,我不知道查詢將返回什麼類型的值。如何從Java中的ResultSetMetaData獲取不同的數據類型?

我已經寫了下面的代碼,假設所有結果都是字符串。但是我也想得到每個值的類型。我怎樣才能做到這一點?

下面是我寫的代碼。

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

在這一點上,我想獲得列類型,並根據數據類型獲取值。

+0

大家好。這是未來訪客的信息。如果您的要求是獲取字段值,而不考慮該列的數據類型,則可以在插入時使用resultSet的getObject方法和PreparedStatement的setObject方法。這是一個例如。 '而(rsdata.next()) \t \t { \t \t \t對(INT I = 0; I learner

回答

30

ResultSetMetaData.getColumnType(int column)的回報int值,指定在java.sql.Types發現列類型。

例子:

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

好答案。也許挑剔,但有一個問題:爲什麼在while循環中檢索* ResultSetMetaData *對象?我的意思是它仍然是一樣的,列名和它們的類型也是一樣的。在'while'循環之前,您可以只檢索一次* ResultSetMetaData *對象。 – informatik01

+0

沒有'ResultSet'的迭代,你會遇到如下的異常:'java.sql。SQLException:光標位置無效.'。迭代按指定的方向移動光標或默認爲「FORWARD」。 –

+0

當然,我知道你必須使用'rs.next()'迭代/移動到下一行。我是說** ResultSetMetaData **對象,它是**相同的**,不需要迭代。所以你可以在進入'while循環之前輕鬆地檢索** ResultSetMetaData **對象** **,並且它不會給你任何異常。 – informatik01

3

可以調用,

返回指定列的SQL類型。

int ResultSetMetaData.getColumnType(int column)

返回指定列的數據庫特定的類型名稱。

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

我覺得上面的答案是不循環會,並有一些缺乏細節。這段代碼可以改進,只顯示列名和相應的數據類型。這裏是完整的工作代碼

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)); 
      } 
     } 
    } 
} 
相關問題