2017-11-16 16 views
0

クエリを作成するためにMySQLデータ型を認識するメソッドを作成しようとしていますが、何らかの理由で機能しません。ここでJDBCメタデータがmysqlデータ型を認識しない

は失敗コードです:

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){ 

} 

さて問題は、数12が返されても、それはvarchar型を認識しないということである。

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方法ですシステムアウトプリントで試してみるたびに。 if文またはswitchでそれを検出しようとすると、結果は整数だけを登録するか、すべてを整数として扱うかのいずれかです。なぜこれが当てはまるのか分かりません。

私のCSVファイルはこのようになります。最初のものはintで、2番目のものはStringです。それは少なくともそれがすべきことであり、それがデータベースにある方法です。

1,Per Lauvås 
2,Per Per 

答えて

1

あなたreturnDataType方法は、常にテーブルの最初の列の種類を返します。あなたはそれを修正する必要があります。プリペアドステートメントのパラメータメタデータ、またはおそらくDatabaseMetaDataの列メタデータを使用する必要があります。または、少なくとも右の列インデックスにアクセスします。

ifブランチも切り替えました。タイプ4java.sql.Types.INTEGERですが、タイプ12java.sql.Types.VARCHARですが、文字列として設定しようとしましたが、変換に失敗する可能性がある整数として設定しようとしました。

追記:あなたが代わりにあなたがjava.sql.Types定数INTEGERVARCHARTIMETIMESTAMPを使用する必要があり、4、12、92および93のような整数値を使用しないでください。コードを読みやすくし、上記のような間違いを検出しやすくします。

関連する問題