Thanks for taking the time Ulric, I'm using sqlitejdbc-v054 from http://files.zentus.com/sqlitejdbc/, I notice they are up to v056, so I'll give that a go.
The stack trace <error> ERROR 53:13 [DB.prepareStatement() 697]: Error in sql: INSERT INTO delay_forms (t2_access_wp_action_required, t2_access_key, t2_access_vegetation, t2_access_streetlight_blocked, t2_access_other, t4_safety_wp_action_required, t4_safety_hv_line_too_close, t4_safety_network_unsafe, t4_safety_danger_tag_reference, t4_safety_other, t4_safety_additional_information, t7_cant_find_job_wp_action_required, t7_cant_find_job_site_visit_check, t7_cant_find_job_dfis_check, t7_cant_find_job_street_directory_check, t7_cant_find_job_dome_check, t7_cant_find_job_pole_check, t7_cant_find_job_streetlights_check, t7_cant_find_job_time_arrived_on_site, t7_cant_find_job_time_left_site, t8_underground_fault_supply_voltage_at_base, t8_underground_fault_description, t8_underground_fault_contractor_name, t8_underground_fault_contractor_phone, work_order, t1_traffic_management, t3_material, diagram_or_photograph) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) java.sql.SQLException: SQL logic error or missing database at org.sqlite.DB.throwex(DB.java:288) at org.sqlite.DB.exec(DB.java:68) at org.sqlite.Conn.commit(Conn.java:172) at tabletapp.database.DB.prepareStatement(DB.java:695) at tabletapp.database.DB.save(DB.java:778) at tabletapp.FormPanel.saveData(FormPanel.java:627) at tabletapp.FormView$3.actionPerformed(FormView.java:242) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.Component.processMouseEvent(Component.java:6263) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6028) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2476) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:178) at java.awt.Dialog$1.run(Dialog.java:1045) at java.awt.Dialog$3.run(Dialog.java:1097) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Dialog.show(Dialog.java:1095) at java.awt.Component.show(Component.java:1563) at java.awt.Component.setVisible(Component.java:1515) at java.awt.Window.setVisible(Window.java:842) at java.awt.Dialog.setVisible(Dialog.java:985) at org.jdesktop.application.SingleFrameApplication.show(SingleFrameApplication.java:296) at tabletapp.TabletApp.showEditForm(TabletApp.java:153) at tabletapp.TableView.mainTableMouseClicked(TableView.java:517) at tabletapp.TableView.access$700(TableView.java:39) at tabletapp.TableView$6.mouseClicked(TableView.java:401) at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:253) at java.awt.Component.processMouseEvent(Component.java:6266) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6028) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4574) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4247) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2476) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122) </error> And heres th full code block <code> public void prepareStatement(String table, String sql, LinkedHashMap<String, String> data) { try { String typeID = ""; PreparedStatement ps = connection.prepareStatement(sql); log.debug("Preparing SQL: " + sql.replace("\n", "")); int parameterIndex = 1; //for (String columnName : getColumnNames(table)) { for (String columnName : data.keySet()) { typeID = getColumnType(table, columnName); if (data.containsKey(columnName)) { String value = data.get(columnName); if (value == null || "".equals(value)) { //log.debug(columnName+":"+parameterIndex+" set to null"); ps.setNull(parameterIndex, Types.NULL); } else { //log.debug(columnName+":"+parameterIndex+" set to "+value); switch (getColumnTypeId(table, columnName)) { case Types.VARCHAR: case Types.CHAR: log.debug("Parameter " + parameterIndex + " = " + value); ps.setString(parameterIndex, value); break; case Types.TIMESTAMP: DateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Timestamp timestamp = new Timestamp(new java.util.Date().getTime()); try { timestamp = new Timestamp(timestampFormat.parse(value).getTime()); } catch (ParseException e) { log.error("Unable to parse timestamp: " + value + "."); } log.debug("Parameter " + parameterIndex + " = " + timestamp); ps.setTimestamp(parameterIndex, timestamp); break; case Types.DATE: DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); java.sql.Date date = new java.sql.Date(new java.util.Date().getTime()); try { timestamp = new Timestamp(dateFormat.parse(value).getTime()); } catch (ParseException e) { log.error("Unable to parse date: " + value + "."); } log.debug("Parameter " + parameterIndex + " = " + date); ps.setDate(parameterIndex, date); break; case Types.SMALLINT: case Types.INTEGER: case Types.NUMERIC: log.debug("Parameter " + parameterIndex + " = " + value); ps.setInt(parameterIndex, new Integer(value)); break; case Types.FLOAT: log.debug("Parameter " + parameterIndex + " = " + value); ps.setFloat(parameterIndex, new Float(value)); break; case Types.BLOB: // convert to byte array to blob byte[] bData; ByteArrayInputStream bais ; try { bData = tabletapp.util.Base64.toBytes(value); log.info("I have " + bData.length + " bytes in Bytes[]"); bais = new ByteArrayInputStream(bData); //String mimeType = //log.info("Mime types: "+mimeType);} } catch (Exception e) { bData = null; log.info("Something went Horribly, Horribly Wrong"); log.info(e.getLocalizedMessage()); } bais = new ByteArrayInputStream(bData); log.info("Database is " + dbType); if (dbType.equals("sqlite")) { try { ps.setBytes(parameterIndex, bData); } catch (SQLException e) { log.debug(e.getLocalizedMessage()); } log.info("Sqlite Blob set to " + value); } else { ps.setBlob(parameterIndex, bais, bData.length); } log.debug("Parameter " + parameterIndex + " = [BLOB]"); break; case Types.BOOLEAN: case Types.BIT: //log.debug(table + "." + columnName + " (boolean) = " + value); Boolean val = ("1".equals(value) || "true".equals(value)); log.debug("Parameter " + parameterIndex + " = " + val); ps.setBoolean(parameterIndex, val); break; default: log.debug("Parameter " + parameterIndex + " = " + value); ps.setString(parameterIndex, value); break; } } parameterIndex++; } } ps.executeUpdate(); connection.commit(); } catch (SQLException e) { log.error("Error in sql: " + sql); e.printStackTrace(); } } </code> Ulric Auger wrote: > Having the complete stack trace of the exception would help a lot. > > Here are some thoughts: > 1- You did not explicitly close the preparedstatement before calling > commit. > 2- You are trying to commit without having started a transaction. > > I don't think the problem is related to the setBytes() as I have similar > code in my application and it work perfectly. > > Which version of SQLiteJDBC you are using? > > Ulric > > > -- Peter _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users