我尝试创建一种方法来识别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
答案 0 :(得分:1)
您的returnDataType
方法始终返回表格的第一列的类型。你需要解决这个问题。您应该使用预准备语句的参数元数据,或者DatabaseMetaData
中的列元数据。或者至少访问正确的列索引。
你也改变了你的if分支。类型4
是java.sql.Types.INTEGER
,但是您尝试将其设置为字符串,而类型12
是java.sql.Types.VARCHAR
,但您尝试将其设置为整数(带有转换)可能会失败)。
旁注:您不应使用4,12,92和93之类的整数值,而应使用java.sql.Types
常量INTEGER
,VARCHAR
,TIME
和{ {1}}。它将使您的代码更具可读性,并且更容易检测上述错误。