2012-02-15 3 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 с string concatenation

+1

Чтобы проиллюстрировать следующие действия, выполните «insert into theTableTable (dateColumn)» («20121121 16:00:00») ' – Oybek

+0

@Oybek: Это не-ISO и устаревший стандарт SQL Server. См. Ссылку, – gbn

+0

@manimaran: У меня есть. Ваша дата/форматы неверны. Простой – gbn

0

Ваш объект date1 будет отформатирован с использованием стандартного toString(), представляющего java.lang.Date, что вряд ли совместимо с различными форматами дат, поддерживаемыми вашими драйверами JDBC.

Скорее используйте другой объект SimpleDateFormat для форматирования date1 в формат даты по умолчанию для SQL Server, прежде чем добавлять его в ваш запрос.

Также сделайте себе одолжение и прочитайте на PreparedStatements и параметризованных запросах; они действительно облегчают этот вид вещей.

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

+1

+1 Почему американцы думают, что «ММ-ДД-ГГГГ» имеет какой-то смысл? Мы пишем номера от самых больших до самых маленьких: 927 - это 9x100 2x10 7x1 ... 100's's's's's's -w e, не пишите это 297! А что с ногами и дюймами ??? Пусть это пройдет в США! Брось это! Присоединяйтесь ко всему остальному миру! –