2012-02-15 13 views
2

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この例外を得ている:変換が失敗したときに日付を変換および/または文字列からの時刻。

答えて

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

あなたのテーブルへの挿入(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とparamaterisedクエリを読んでください。彼らは本当にこの種のものを簡単にします。

5

まず、アメリカ人だけが遅れたMM-DD-YYYYフォーマットを日付として使用します。誰もが/他のすべてのもの、特にデータベースは、ISOフォーマットYYYY-MM-DDを使用します。

第2に、JDBCを使用する方法を使用すると、心配する必要はありません。 JDBCドライバーはあなたのオブジェクトをあなたのためにあなたのSQLにフォーマットすることを扱うので、あなたは幸せな無知であなたの遅滞フォーマットを使い続けることができます。

3番目(これはマイナーである)、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なぜアメリカ人は 'MM-DD-YYYY'が意味をなさないと思うのですか?私たちは最大から最小の数字を書いています:927は9x100です2x10 7x1 ... 100は10の1の-w eはそれを書いていません297!足とインチで何が???それはアメリカに行こう!それを放棄!残りの世界に参加しましょう! –

関連する問題