2017-03-29 10 views
1

こんにちは、日付型の型指定子を追加する方法がわからない、問題がありますか? %%を使用しようとしましたが、これはうまくいかないようです。SQL型指定子

public class OrderDB implements OrderDBIF { 
@Override 
public Order create(Date date, int totalAmount, String deliveryStatus, Date deliveryDate, int invoiceId, int customerId) throws SQLException { 
    String sql = String.format("INSERT INTO Order (date, totalAmount, deliveryStatus, deliveryDate, invoiceId, customerId) VALUES " 
      + "('%%', '%d', '%s', '%%', '%d', '%d')", date, totalAmount, deliveryStatus, deliveryDate, invoiceId, customerId); 
    try (Connection conn = DBConnection.getInstance().getDBcon(); 
     Statement stmt = conn.createStatement()) { 
     stmt.executeUpdate(sql); 
    } catch(SQLException e) { 
     e.printStackTrace(); 
     throw e; 
    } 
+3

日付は文字列を使用して挿入されます(通常は「YYYY-MM-DD」)。ただし、パラメータ化されたクエリを使用する方法を学ぶ必要があります。そうすれば、パラメータはアプリケーションからデータベースへの型付けを処理します。 –

+0

@GordonLinoffは言ったように、あなたの日付が特定の形式であることを確認する必要があります。 'deliveryDate'に指定された形式の値があることを確認する必要があります – Ravi

+1

これはSQLインジェクションの問題です。 PreparedStatementを使用してクエリを実行します。 – Milaci

答えて

3

プリペアドステートメントを使用します。

String sql = "INSERT INTO Order " 
    + "(date, totalAmount, deliveryStatus, deliveryDate, invoiceId, customerId) VALUES " 
    + "(?,?,?,?,?,?)"; 
try (Connection conn = DBConnection.getInstance().getDBcon(); 
    PreparedStatement ps = conn.prepareStatement(sql)) { 
    ps.setDate(1, date); 
    ps.setInt(2, totalAmount); 
    ps.setString(3, deliveryStatus); 
    ps.setDate(4, deliveryDate); 
    ps.setInt(5, invoiceId); 
    ps.setInt(6, customerId); 
    ps.executeUpdate(); 
} catch(SQLException e) { 
    e.printStackTrace(); 
    throw e; 
} 

INSERTのすべての値のための適切なエスケープの世話をすることに加えて、準備された文はまた、SQLインジェクションに対して保護されます。

関連する問題