我正在使用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);
答案 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
非常笨拙。考虑使用SimpleDateFormat
将String
转换为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 -to-sql.date(或)sql.time)从时间戳转换回日期或时间部分,尽管大多数数据库都是允许从一个人到另一个本地地进行铸造。
当你将getTime()方法传递给java.util.date对象时,它会返回一个'long'值(即自1970年1月1日Unix时代以来的时间!)我不知道它如何处理时间和在此之前的日期(我假设它们只是一个'负'值?)。
如果您想混淆您的个人并使您的代码混淆,您甚至可以将您的日期存储在数据库中作为长值;)
大卫
答案 2 :(得分:-1)
尝试从日历实例中检索时间。 即calendar.getTime()。 (它返回Date对象) 您可能还需要将其强制转换为SQL日期。