2012-02-15 207 views
2

我想在sql服务器中插入记录。表名和列在此代码中指定,转换日期和/或时间从字符串转换失败

 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:转换失败时,转换日期和/或来自字符串的时间。

回答

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注入的,常引起常数字符串连接

+1

只是为了举例说明以下内容将工作'insert into YourTable(dateColumn)values('20121121 16:00:00')' – Oybek 2012-02-15 13:25:11

+0

@Oybek:这是非ISO和传统SQL Server标准。看到链接, – gbn 2012-02-15 13:30:46

+0

@manimaran:我有。你的日期/格式是错误的。简单 – gbn 2012-02-16 07:43:11

0

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

追加到您的查询之前使用别的SimpleDateFormat的对象格式date1到您的SQL Server的默认日期格式。

另外,请你帮个忙,并用预处理念起来paramaterised查询;他们真的使这种东西更容易。

5

首先,只有美国人使用延迟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

苛刻,但公平。 – gbn 2012-02-15 13:31:42

+1

+1为什么美国人认为'MM-DD-YYYY'有什么意义?我们写出从最大到最小的数字:927是9x100 2x10 7x1 ... 100's 10's 1's -w e不写297!什么与脚和英寸?让它走向美国!放弃!加入世界其他地区! – 2012-02-15 13:42:16

相关问题