【问题标题】:JDBC metadata doesn't recognize mysql data typesJDBC 元数据无法识别 mysql 数据类型
【发布时间】:2018-04-30 14:55:21
【问题描述】:

我正在尝试创建一种方法来识别 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,即使我每次尝试使用系统输出打印时都会返回数字 12。当我尝试使用 if 语句或 switch 来检测它时,结果要么它们只注册整数,要么将所有内容都视为整数。我似乎不明白为什么会这样。

我的 CSV 文件是这样的,第一个是 int,第二个是 String。至少它应该是这样,在数据库中也是这样。

1,Per Lauvås
2,Per Per

【问题讨论】:

    标签: java mysql csv jdbc


    【解决方案1】:

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

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

    旁注:不应使用 4、12、92 和 93 等整数值,而应使用 java.sql.Types 常量 INTEGER、VARCHAR、TIME 和 TIMESTAMP。它将使您的代码更具可读性,并更容易检测到上述错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      相关资源
      最近更新 更多