2017-09-20 3 views
1

Ich habe eine Anwendung, die ich versuche zu aktualisieren, da es einen jdbc-Treiber (sun.jdbc.odbc.jdbcodbcdriver) verwendet wurde, und bin jetzt mit Ucanaccess. Momentan greift die Anwendung korrekt auf die Datenbank zu, führt jedoch keine Änderungen an der Access-Datenbank durch, was möglicherweise auf das Datumsformat oder das Zeitformat zurückzuführen ist."UCAExc ::: 4.0.2 unbekanntes Token:" für INSERT mit Datum und Uhrzeit Literalen

Eine Funktion zum Löschen einer Zeile aus einer Tabelle wurde erfolgreich ausgeführt, wenn das Datumsformat von # 01/02/08 # auf # 01/02/2008 # geändert wurde.

Hier ist ein Ausgang des querystring:

Insert into 
follow(
f_c_id, 
f_date, 
f_time_begin, 
f_time_end, 
f_flag_begin_in, 
f_flag_end_in, 
start_map_number, 
end_map_number, 
b_observer, 
map_observer, 
start_Map_Time, 
end_Map_Time, 
f_duration) values (
'ert', 
#11/11/1989#, 
#11:11#, 
#12:12#, 
-1, 
-1, 
1, 
21, 
'sf', 
'sdg', 
#12:12#, 
#13:13#, 
61) 

Hier ein Ausschnitt der Funktion:

try { 

     Class.forName("net.ucanaccess.jdbc.UcanaccessDriver"); 
     conn = DriverManager.getConnection("jdbc:ucanaccess://C:/Data/Example.mdb", "", ""); 
     stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 

     queryString = "Insert into following (f_c_id, f_date, f_time_begin, f_time_end, " + 
       "f_flag_begin_in, f_flag_end_in, start_map_number, end_map_number, b_observer," + 
       "map_observer, start_Map_Time, end_Map_Time,f_duration)" + 
       " values ('" + IDText.getText() + 
       "'," + "#" + focalDate + "#" + 
       "," + "#" + focalTimeStart + "#" + 
       "," + "#" + focalTimeEnd + "#" + 
       "," + startNestCheck + "," + endNestCheck + 
       "," + startMapNumText.getText() + 
       "," + endMapNumText.getText() + 
       ",'" + bObserverText.getText() + 
       "','" + mapObserverText.getText() + 
       "'," + "#" + startMapTime + "#" + 
       "," + "#" + endMapTime + "#" + 
       "," + fDuration + 
       ")"; 
     System.out.print(queryString); 
     stmt.executeUpdate(queryString); 
     conn.close(); 
    } catch (Exception e) { 
     if (!(e.getMessage().equalsIgnoreCase("No ResultSet was produced"))) { 
      e.printStackTrace(); 
      System.exit(1); 
     } 
    } 

und Stacktrace:

net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.2 unknown token: 
at net.ucanaccess.jdbc.UcanaccessStatement.executeUpdate(UcanaccessStatement.java:221) 
at Test.clearTable(Test.java:2335) 
at Test.genericButtonActionPerformed(Test.java:2266) 
at Test.access$1200(Test.java:20) 
at Test$14.actionPerformed(Test.java:801) 
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 
at java.awt.Component.processMouseEvent(Component.java:6533) 
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 
at java.awt.Component.processEvent(Component.java:6298) 
at java.awt.Container.processEvent(Container.java:2236) 
at java.awt.Component.dispatchEventImpl(Component.java:4889) 
at java.awt.Container.dispatchEventImpl(Container.java:2294) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888) 
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525) 
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466) 
at java.awt.Container.dispatchEventImpl(Container.java:2280) 
at java.awt.Window.dispatchEventImpl(Window.java:2746) 
at java.awt.Component.dispatchEvent(Component.java:4711) 
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758) 
at java.awt.EventQueue.access$500(EventQueue.java:97) 
at java.awt.EventQueue$3.run(EventQueue.java:709) 
at java.awt.EventQueue$3.run(EventQueue.java:703) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90) 
at java.awt.EventQueue$4.run(EventQueue.java:731) 
at java.awt.EventQueue$4.run(EventQueue.java:729) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80) 
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201) 
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82) 
Caused by: java.sql.SQLSyntaxErrorException: unknown token: 
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
at org.hsqldb.jdbc.JDBCStatement.executeUpdate(Unknown Source) 
at net.ucanaccess.jdbc.ExecuteUpdate.executeWrapped(ExecuteUpdate.java:67) 
at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:208) 
at net.ucanaccess.jdbc.ExecuteUpdate.execute(ExecuteUpdate.java:50) 
at net.ucanaccess.jdbc.UcanaccessStatement.executeUpdate(UcanaccessStatement.java:219) 
... 40 more 
Caused by: org.hsqldb.HsqlException: unknown token: 
at org.hsqldb.error.Error.error(Unknown Source) 
at org.hsqldb.error.Error.error(Unknown Source) 
at org.hsqldb.ParserBase.read(Unknown Source) 
at org.hsqldb.ParserDQL.XreadPredicateRightPart(Unknown Source) 
at org.hsqldb.ParserDQL.XreadBooleanPrimaryOrNull(Unknown Source) 
at org.hsqldb.ParserDQL.XreadBooleanTestOrNull(Unknown Source) 
at org.hsqldb.ParserDQL.XreadBooleanFactorOrNull(Unknown Source) 
at org.hsqldb.ParserDQL.XreadBooleanTermOrNull(Unknown Source) 
at org.hsqldb.ParserDQL.XreadBooleanValueExpression(Unknown Source) 
at org.hsqldb.ParserDML.compileDeleteStatement(Unknown Source) 
at org.hsqldb.ParserCommand.compilePart(Unknown Source) 
at org.hsqldb.ParserCommand.compileStatements(Unknown Source) 
at org.hsqldb.Session.executeDirectStatement(Unknown Source) 
at org.hsqldb.Session.execute(Unknown Source) 
... 46 more 

Process finished with exit code 1 
+1

Sie sollten Werte nicht in eine Abfragezeichenfolge wie diese verketten, sondern eine vorbereitete Anweisung mit Parametern verwenden. Ihr Code ist anfällig für SQL-Injection. –

+0

Related: https://StackOverflow.com/q/21955256/1531971 & https://StackOverflow.com/q/28439400/1531971 – jdv

+0

Mögliche Duplikat von [UCanAccess SQL einfügen fehlgeschlagen; Abfrage funktioniert einwandfrei in MS Access unerwartetes Token (UcanaccessStatement.java:222)](https://Stackoverflow.com/questions/35492250/ucanaccess-sql-insert-failing-query-works-fine-in-ms-access-unexpected -token -u) – tk421

Antwort

1

UCanAccess (derzeit) nicht erkennt Nur-Zeit-Literale, die nur die Stunde und Minute enthalten. Es erkennt jedoch Literale, die Stunde, Minute und Sekunde enthalten.

dies So scheitern ...

UCanAccess>INSERT INTO Table4 (dtmField) VALUES (#11:11#); 
UCanAccess>UCAExc:::4.0.2 unknown token: 

... aber das funktioniert:

UCanAccess>INSERT INTO Table4 (dtmField) VALUES (#11:11:00#); 
UCanAccess>1 row(s) affected 

Ebenso ist es nicht Datumsliterale mit zweistelligen Jahren erkennen, so dass diese fehlschlägt ...

UCanAccess>INSERT INTO Table4 (dtmField) VALUES (#12/25/17#); 
UCanAccess>UCAExc:::4.0.2 unknown token: 

... aber dies gelingt:

UCanAccess>INSERT INTO Table4 (dtmField) VALUES (#12/25/2017#); 
UCanAccess>1 row(s) affected 
+0

Danke, ich werde glauben das beantwortet meine Frage! –