2017-05-14 1 views
1

Die Absicht meines Gesamtprogramms ist, Werte aus Access-Datenbank abzurufen und in Jtable für ein bestimmtes Datum anzuzeigen. Ich habe eine Tabelle in Access-Datenbank, wo for_date Feld als Datum/Uhrzeit Feld und Format ist Kurzes Datum (TT-MM-JJJJ). Jetzt erfordert mein Programm, dass ich die Zeilen für ein bestimmtes Datum aus der Datenbank abrufe. Ich habe SimpleDateFormat verwendet, um es im Format als Access-Datenbank zu konvertieren, aber es gibt einen Fehler. Der Fehler, den ich bekomme, ist: - net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc ::: 3.0.4 inkompatible Datentypen in Kombination.Diese Ausnahme kann passieren, wenn Sie Ganzzahlen, die Einheiten von Zeit direkt zu datetime Werte mit dem arithmetischen plus-Operator aber hinzufügen ohne das Gerät von date.In diesem speziellen Fall zu spezifizieren, welches Sie verwenden müssen, zum Beispiel +1 TAGFehler "inkompatible Datentypen in Kombination" mit Abfrage auf Datumswert

Mein Code ist wie folgt: -

String table_sel = "ISGS_table"; 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
String date1 = sdf.format(report_date.getDate()); 
try{ 
String sql = "Select reporting_date as REPORTING_DATE,for_date as FOR_DATE,outage_date as OUTAGE_DATE,outage_time as OUTAGE_TIME,stat_detail as STATION_DETAILS,res_date as RESTORATION_DATE,rest_time as RESTORATION_TIME,rest_reason as RESTORATION_REASON from " + table_sel+" where for_date='" + date1 + "'"; 
Connection con = null; 
      Statement st = null; 
      ResultSet rs = null; 
      PreparedStatement pst = null; 
      String dbURL = "jdbc:ucanaccess://C:\\Users\\Dell_PC\\Documents\\SYSTEM_OUTAGE_REPORT.accdb"; 
      con = DriverManager.getConnection(dbURL); 
      st = con.createStatement(); 
      pst = con.prepareStatement(sql); 
      rs = pst.executeQuery(); 
jTable1.setModel(DbUtils.resultSetToTableModel(rs)); 
    con.close(); 
     } catch (Exception e) { 
      JOptionPane.showMessageDialog(null, e); 
     } 
+0

Version 3.0.4 ist ziemlich alt; Vielleicht sollten Sie ein Upgrade auf die neueste Version (derzeit 4.0.2) in Betracht ziehen. –

+0

Ich habe die Version 4.0.2 jetzt wie von Ihnen vorgeschlagen installiert! – user1

Antwort

0

Sie erhalten diese Fehlermeldung, weil Sie Übergabe des Wertes für for_date als String-Literal. UCanAccess folgt der Access SQL-Konvention der Verwendung von Hash-Markierungen (#) als Trennzeichen für Datums-/Zeitliterale.

So wird dies mit dem Fehler fehlschlagen Sie

zitiert
... WHERE for_date = '2017-02-03' 

während dieser

... WHERE for_date = #2017-02-03# 

Hinweis arbeiten, dass es besser Form in Betracht gezogen werden, wenn Sie eine PreparedStatement mit

verwenden waren
... WHERE for_date = ? 

und übergeben Sie den Datumswert mit PreparedStatement#setDate.

+0

Hallo Gord! Ich habe versucht, was Sie vorgeschlagen haben, aber es hat nicht funktioniert. Ich änderte die sql-Abfrage zu sql = "Select Reporting_DATE als REPORTING_DATE, for_date als FOR_DATE, Ausfalldatum als OUTAGE_DATE, Ausfallzeit als OUTAGE_TIME, stat_detail als STATION_DETAILS, res_date als RESTORATION_DATE, rest_time als RESTORATION_TIME, rest_reason als RESTORATION_REASON von" + table_sel + "wobei for_date = # 2017-05-01 # "; aber es gab immer noch keine Ausgabe, obwohl ein Datumsfeld mit dem Wert 01-05-2017 in meiner Access-Datenbank gespeichert war. – user1

+0

Ich versuchte es auch mit vorbereiteten Statement, aber ohne Erfolg. sql = "Wählen Sie reporting_date als REPORTING_DATE, for_date als FOR_DATE, outage_date als OUTAGE_DATE, outage_time als OUTAGE_TIME, stat_detail als STATION_DETAILS, res_date als RESTORATION_DATE, rest_time als RESTORATION_TIME, rest_reason als RESTORATION_REASON aus" + table_sel + "wobei for_date =?"; java.util.Date utilStartDate; java.sql.Date sqlStartDate; utilStartDate = Bericht_Datum.getDate(); sqlStartDate = new java.sql.Date (utilStartDate.getTime()); pst.setDate (1, sqlStartDate); – user1

+0

Sehen Sie, ob Sie ein Ergebnis erhalten, wenn Sie 'SELECT TOP 1 ... WHERE for_date> =?' Verwenden und wenn ja, prüfen Sie den tatsächlichen Wert von 'for_date', der zurückgegeben wird. (Genauer gesagt, sehen Sie, ob eine Zeitkomponente damit verbunden ist.) –

Verwandte Themen