2017-02-14 83 views
3

我需要檢查從結果集中提取的值在使用之前是否不爲NULL。 我發現這個溶液JAVA - 從結果集中檢查NULL值

int value = 0; 
ResultSet rs = stmt.executeQuery(query); 
if (rs.next()) { 
    value = rs.getInt("FIELD"); 
    if (!rs.wasNull()) { 
     // use NOT NULL field value 
    } 
} 

但我需要直接檢查字段值,沒有賦值給一個變量,因爲數據類型不是預先已知的。

爲了更好地解釋爲目標,在這裏我的代碼:

Method method_one = null, methodResultSet=null; 

switch(field_type){ 
    case "int": 
     method_one = clazzAbstractClass.getDeclaredMethod("setValue_INT", short[].class,String.class,int.class); 
     break; 
    case "float": 
     method_one = clazzAbstractClass.getDeclaredMethod("setValue_FLOAT", short[].class,String.class,float.class); 
     break; 
    case "double": 
     method_one = clazzAbstractClass.getDeclaredMethod("setValue_DOUBLE", short[].class,String.class,double.class); 
     break; 
} 

methodResultSet = clazzResultSet.getDeclaredMethod("get"+field_type.substring(0, 1).toUpperCase() + field_type.substring(1), String.class); // e.g. rs.getInt 

// current call with NO CHECK on NULL     
method_one.invoke(my_object, methodResultSet.invoke(rs, FIELD_NAME); 

幾句話,代碼創建了這樣的事情:

my_object.setValue_INT(rs.getInt("FIELD")) 

NB:getInt使用0爲NULL默認值值

我的目標是直接將FIELDVALUE或NULL作爲setValue_INT函數的參數。

回答

1

您可能可以嘗試使用ResultSet.getObject(int columnIndex)方法。從它的JavaDoc描述:

此方法將返回給定列的值作爲Java對象。 Java對象的類型將是JDBC規範中指定的內置類型的映射之後的默認Java對象 類型,該類型對應於列的SQL類型。 如果值爲 SQL NULL,則驅動程序返回Java null。

+0

好的。以下解決方案可以是正確的:如果'(rs.getObject(NAME)!= NULL) \t \t \t \t \t \t methodAbstractClass.invoke(my_object,methodResultSet.invoke(RS,NAME); \t \t \t \t \t其他 \t \t \t \t \t \t methodAbstractClass.invoke(my_object,NULL);' – Fab

1

由於檢查NULL這種方式繁瑣,我用的輔助方法如下所示:

private static Integer getResultSetInteger(ResultSet resultset, String colName) throws SQLException { 
    int v = resultset.getInt(colName); 

    if (resultset.wasNull()) { 
     return null; 
    } 

    return Integer.valueOf(v); 
} 

private static Double getResultSetDouble(ResultSet resultset, String colName) throws SQLException { 
    double v = resultset.getDouble(colName); 

    if (resultset.wasNull()) { 
     return null; 
    } 

    return Double.valueOf(v); 
} 

然後,而不是

my_object.setValue_INT(rs.getInt("FIELD")); 

你寫

my_object.setValue_INT(getResultSetInteger(rs, "FIELD")); 
2

ResultSetMetaData.getColumnType(int column)返回一個in t值指定列類型。

ResultSet rs = stmt.executeQuery(query); 
if (rs.next()) { 
    if (!rs.wasNull()) { 
     ResultSetMetaData rsmd = rs.getMetaData(); 
     //Below, i ----> column number of the column 'FIELD'. 
     int type = rsmd.getColumnType(i); 
     if (type == Types.VARCHAR || type == Types.CHAR) { 
      System.out.print(rs.getString()); 
     } else { 
      System.out.print(rs.getLong(i)); 
     } 
    } 
} 
+0

@Fab這是否有效? – Journey