JDBC元数据无法识别mysql数据类型

时间:2017-11-16 22:40:52

标签: java mysql csv jdbc

我尝试创建一种方法来识别MySQL数据类型以创建查询,但由于某种原因它无法正常工作。

以下是失败的代码:

int type = meta.returnDataType(data[i], table);

if(type == 4){
    preparedStatement.setString(i + 1, data[i]);
    System.out.println("String går");
}if(type == 12){
    preparedStatement.setInt(i + 1, Integer.parseInt(data[i]));
    System.out.println("int går");
}else if(type == 92){
    DateFormat formatter = new SimpleDateFormat("HH:mm");
    preparedStatement.setTime(i + 1, new java.sql.Time(formatter.parse(data[i]).getTime()));
}else if(type == 93){
    DateFormat formatter = new SimpleDateFormat("yyyy:MM:dd HH:mm");
    preparedStatement.setTimestamp(i + 1, new java.sql.Timestamp(formatter.parse(data[i]).getTime()));
}

这是我的returnDataType方法:

try(Connection con = DBConnection.getMySQLDataSourceForUpdate().getConnection();
    Statement stmt = con.createStatement()){
    String query = "select * from " + table;

    ResultSet rs = stmt.executeQuery(query);
    ResultSetMetaData rsmd = rs.getMetaData();
    return rsmd.getColumnType(1);

}catch(IOException e){

}catch (SQLException e){

}

现在的问题是它无法识别varchar,即使每次我尝试使用system out print返回数字12时也是如此。当我尝试用if语句或switch来检测它时,结果是它们只注册整数或者它们都将整数视为整数。我似乎无法理解为什么会这样。

我的CSV文件是这样的,第一个是int,第二个是String。至少应该是它应该是什么,以及它在数据库中的方式。

1,Per Lauvås
2,Per Per

1 个答案:

答案 0 :(得分:1)

您的returnDataType方法始终返回表格的第一列的类型。你需要解决这个问题。您应该使用预准备语句的参数元数据,或者DatabaseMetaData中的列元数据。或者至少访问正确的列索引。

你也改变了你的if分支。类型4java.sql.Types.INTEGER,但是您尝试将其设置为字符串,而类型12java.sql.Types.VARCHAR,但您尝试将其设置为整数(带有转换)可能会失败)。

旁注:您不应使用4,12,92和93之类的整数值,而应使用java.sql.Types常量INTEGERVARCHARTIME和{ {1}}。它将使您的代码更具可读性,并且更容易检测上述错误。