在JDBC中使用Calendar对象

时间:2012-08-21 23:43:45

标签: java sql jdbc calendar derby

我正在使用Netbeans和Derby数据库。我想插入带有日期字段的表记录,因此我被告知要使用Calendar对象,因为它包含我需要的内容:日期(日,月和年),小时和分钟。

正如您在下面的代码中看到的,表字段的类型为DATE。 当我尝试将Calendar对象作为字符串插入时(使用下面的代码中的逗号),我得到:

  

日期时间值的字符串表示的语法不正确。

当我尝试插入没有逗号时,我得到:

  

语法错误:第1行第159列遇到“[”

可能与Calendar对象有关。我在这里缺少什么?

String from = fromForm.getText();
String to = toForm.getText();
String []date = dateForm.getText().split("/");
String []time = timeForm.getText().split(":");
int places = Integer.parseInt(placesForm.getText());
int closinghours=Integer.parseInt(closingHoursForm.getText());
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Integer.parseInt(date[2]),Integer.parseInt(date[1]),Integer.parseInt(date[0]),Integer.parseInt(time[0]),Integer.parseInt(time[1]));

String query="INSERT INTO APP.TRUMPS (TRUMPID,DEPART,ARRIVE,START,PLACES,PROPOSING_USER_LOGIN,CLOSING_HOURS)"+
        "VALUES ('"+newTrampTrumpistClient.login+dateForm.getText()+timeForm.getText()+"','"+from+"','"+to+
                "','"+calendar+"',"+places+",'"+newTrampTrumpistClient.login+"',"+closinghours+")";
String result=newTrampTrumpistClient.WritingReading("sql_insert", query);

3 个答案:

答案 0 :(得分:4)

您应该使用PreparedStatement#setTimestamp()设置TIMESTAMP/DATETIME字段(或setDate()设置DATE字段,但这不包括小时和分钟。 ..)。

String sql = "INSERT INTO"
    + " APP.TRUMPS (TRUMPID, DEPART, ARRIVE, START, PLACES, PROPOSING_USER_LOGIN, CLOSING_HOURS)"
    + " VALUES (?, ?, ?, ?, ?, ?, ?)";
// ...

PreparedStatement preparedStatement = null;
// ...

try {
    // ...
    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setString(1, newTrampTrumpistClient.login+dateForm.getText()+timeForm.getText());
    preparedStatement.setString(2, from);
    preparedStatement.setString(3, to);
    preparedStatement.setTimestamp(4, new Timestamp(calendar.getTimeInMillis()));
    preparedStatement.setInt(5, places);
    preparedStatement.setString(6, newTrampTrumpistClient.login);
    preparedStatement.setInt(7, closinghours);
    preparedStatement.executeUpdate();
    // ...
} finally {
    // ...
}

额外的好处是,使用预准备语句可以保护您的申请免受SQL injection attacks

的影响

另见:


对于具体问题

无关,从String转换为Calendar非常笨拙。考虑使用SimpleDateFormatString转换为Date。然后,您可以将其保留为new Timestamp(date.getTime())

答案 1 :(得分:0)

只是添加一些额外的信息......

您是否考虑使用Java.utils.Date对象?

您可以根据需要使用尽可能多的粒度构建它,例如。从“日期”(年:月:日)一直到包括毫秒时间精度。

然后,您可以使用各种getXXX()方法捕获所需的部分。

你必须通过将日期对象传递给日历对象(可能通过GregorianCalendar来做一些jiggery pokery,按照链接在java doc页面上有一个很好的例子。)< / p>

或者,您可以使用Java.util.Date并通过java.util.date的getTime()方法将其传递给Java.sql.date。

您可以对java.sql.time执行相同的操作(即,传入同一个对象,最终只会使用java.util.date对象的时间部分)。如果将相同的方法传递给sql.timestamp,它将给出完整的时间戳。

您也可以使用相同的过程(sql.timestamp - to-util.date -t​​o-sql.date(或)sql.time)从时间戳转换回日期或时间部分,尽管大多数数据库都是允许从一个人到另一个本地地进行铸造。

当你将getTime()方法传递给java.util.date对象时,它会返回一个'long'值(即自1970年1月1日Unix时代以来的时间!)我不知道它如何处理时间和在此之前的日期(我假设它们只是一个'负'值?)。

如果您想混淆您的个人并使您的代码混淆,您甚至可以将您的日期存储在数据库中作为长值;)

大卫

答案 2 :(得分:-1)

尝试从日历实例中检索时间。 即calendar.getTime()。 (它返回Date对象) 您可能还需要将其强制转换为SQL日期。