2016-06-23 2 views
1

私は、このSQLクエリ(Microsoft SQL Server)をJavaアプリケーションとして実行しようとすると、いくつかの問題を発見しています。SQL Serverでこのクエリを実行しようとすると、このエラーが日付フィールドに表示されるのはなぜですか?

だから私は、簡単な選択クエリを実行この方法があります。

public void insertOrUpdate_TIRConsolidatoPolizza(QS_TirPolizza qsTir) throws Exception { 

    try{ 
     log.debug("PucManager.insertOrUpdate_TIRConsolidatoPolizza"); 

     // Reperisce i parametri della query dal parametro passato: 
     String numeroPolizza = qsTir.getPolizzaid().toString(); 
     Long annoRiferimento = qsTir.getAnnoRiferimento(); 
     String dataRiferimentoNav = qsTir.getDataRiferimentoNav() != null ? "'"+qsTir.getDataRiferimentoNav()+"'" : null; 
     String timestamp = qsTir.getTimestamp() != null ? "'"+qsTir.getTimestamp()+"'" : null; 
     String sql = "select * from TirConsolidatoPolizza" + 
       " where Polizzaid = " + numeroPolizza + 
       " and DataRiferimentoNav = " + dataRiferimentoNav; 

     log.debug("Query: " + sql); 
     PreparedStatement ps = con.prepareStatement(sql); 
     log.debug("Eseguo Query"); 
     ResultSet rs = ps.executeQuery(); 

     ................................................... 
     ................................................... 
     DO SOMETHING ELSE 
     ................................................... 
     ................................................... 
} 

文字列のSQL変数の値である(私はそれがlog.debug()ことによってそれを印刷参照):

select * from TirConsolidatoPolizza where Polizzaid = 9999999999 and DataRiferimentoNav = 'Thu Jun 23 10:36:43 CEST 2016' 

DataRiferimentoNavの値に問題があると思われるため、このクエリは機能しません。

10:42:41 [SELECT - 0 row(s), 0.000 secs] [Error Code: 241, SQL State: S0001] Conversion failed when converting date and/or time from character string. 

DataRiferimentoNav(これは、DBテーブル上日時である)の値があるqsTir.getDataRiferimentoNav()物体フィールドから取られる:私は次のエラーメッセージを得る

a 文字列(私はそれを変更することはできません)日付を表すこの方法で私のコードの他の場所に設定されました:

qsTir.setDataRiferimentoNav(new Date().toString()); 

どうしたの?私は何が欠けていますか?この問題を解決してクエリを正しく実行するにはどうすればよいですか?あなたは日付がデータベースによって理解されるように適切なフォーマットに必要

+0

SQLコードをユーザーの値と連結しないでください。この悪い解決策の代わりに、私はパラメータを使用します。 –

答えて

3

:これはSQL injection vulnerabilitiesにあなたを導くことができるよう

Format formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
String formatted = formatter.format(qsTir.getDataRiferimentoNav()); 

理想的、あなたはSQLを連結することは避けてください。あなたの目標を達成するためにparameterized queriesを使用してみてください。

+0

悪い習慣を宣伝するべきではありません。 –

関連する問題