从字符串转换日期和/或时间时转换失败

时间:2012-02-15 13:13:06

标签: java sql-server

我想在sql server中插入记录。表名和列在此代码中指定,

      String str_date=date;

      DateFormat formatter ; 

      formatter = new SimpleDateFormat("MM/dd/yyyy");

      date1 = (Date)formatter.parse(str_date);  

      System.out.println("Today is " +date1 );

     try{

      String query="INSERT INTO BULT_DATA " +
                "(ULDT_ID" +
                ",ULDT_DESC" +
                ",ULDT_DT" +
                ",ULDT_ULTH_ID" +
                ",ULDT_DATA_FILE" +
                ",ULDT_MAX_ROW_NO" +
                ",ULDT_REC_STS" +
                ",ULDT_CRE_USER_ID" +
                ",ULDT_CRE_DT" +
                ",ULDT_UPD_USER_ID" +
                ",ULDT_UPD_DT" +
                ",ULDT_APRV_USER_ID" +
                ",ULDT_APRV_DT)" +
                "VALUES ('"+
                uploadID+"','"+
                uploadDes+"','"+
                date1+"','" +
                templateID+"','"+
                dataFile+"','"+
                noRows+"','" +
                        "N','" +
                        "admin','" +
                        "2011-12-05 18:41:50.000','" +
                        "admin','" +
                        "2011-12-05 18:41:50.000','" +
                        "NULL','" +
                        "NULL')";


            System.out.println("query :: "+query);

        int stmnt= stmt.executeUpdate(query);

                 }catch (Exception e) {

        e.printStackTrace();
 }

但我得到了这个例外

com.microsoft.sqlserver.jdbc.SQLServerException:从字符串转换日期和/或时间时转换失败。

3 个答案:

答案 0 :(得分:6)

首先,只有美国人使用延迟MM-DD-YYYY格式作为日期 - 每个人/所有其他人,尤其是数据库,都使用ISO格式YYYY-MM-DD

其次,如果您按原样使用JDBC,则不必担心。您可以继续使用延迟格式,因为JDBC驱动程序将处理将对象格式化为SQL。

第三种(这是次要的),对于插入更喜欢stmt.execute()而不是stmt.executeUpdate() - 插入不是更新,而是插入。虽然,使用其中任何一个。

总而言之,你得到这样的东西(例如):

String sql = "insert into table (int_col, date_col, boolean_col, text_col)" +
   " values (?, ?, ?, ?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setObject(1, 7);
statement.setObject(2, new Date());
statement.setObject(3, true);
statement.setObject(4, "hello");
statement.execute();

注意:

  • 在sql
  • 中使用占位符?
  • 使用statement.setObject(n, object)
  • 日期和文字占位符周围没有引号

JDBC驱动程序将为所有“常用”java对象执行所有必要的转换和格式化,特别是如果该列/数据类型需要引号,则将值括在引号中。

您可以改变自己的代码,以我在此处演示的方式工作。

答案 1 :(得分:2)

Use an ISO or ODBC date format表示所有值。
或旧版SQL Server yyymmdd hh:nn:ss

MM/dd/yyyy不安全,您为UPD_DT和ULDT_CRE_DT提供的常量也不安全

'19980223 14:23:05'
{ts '1998-02-23 14:23:05'}
{d '1998-02-23'}
'1998-02-23T14:23:05'

您是否听说过SQL注入,通常是由使用字符串连接构建SQL命令引起的

答案 2 :(得分:0)

您的date1对象将使用toString()的标准java.lang.Date表示格式化,这不太可能与JDBC驱动程序支持的各种日期格式兼容。

而是使用另一个SimpleDateFormat对象将date1格式化为SQL Server默认日期格式,然后再将其附加到查询中。

另外,请帮自己一个忙,阅读PreparedStatements和paramaterised查询;他们真的让这种东西更容易。