3

我正在使用 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);
4

3 回答 3

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 注入攻击

也可以看看:


与具体问题无关String,从to转换Calendar非常笨拙。考虑使用SimpleDateFormatto 转换为Stringto Date。然后,您可以将其保留为new Timestamp(date.getTime()).

于 2012-08-22T00:03:15.063 回答
0

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

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

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

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

您必须通过将您的日期对象传递给日历对象(可能通过GregorianCalendar的方式,点击链接,Java doc 页面上有一个很好的示例)来做一些小动作。

或者,您可以使用 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 对象时,它会返回一个“长”值(即自 1970 年 1 月 1 日的 Unix 纪元以来的时间!)我不知道它如何处理在此之前的时间和日期(我认为它们只是一个“负”值?)。

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

大卫

于 2012-08-24T09:33:33.160 回答
-1

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

于 2012-08-21T23:50:35.307 回答