Menu

net.ucanaccess.triggers.TriggerException: Data out of range

Help
2019-02-14
2019-02-15
  • Abdelrazek Nageh

    Hi ,Dev Gord Thompson
    The Date stored in Access as a wrong date like "05/03/3900" when I Declared in Class DB as ps.setDate(2, new Date(2000, 02,05)); the format of (Date/Time Type) is Short Date I defined it in Access 2007, I know TheDate of java.sql.Date; is Deprecated Why stored a wrong date , The Class DB when I compilled it separated with static void main() it's run correctly But record as a wrong
    when I used LocalDate and DatePicker and passes values with set func and I used ps.setObject(2,param from LocalDate);
    throw an Exception net.ucanaccess.triggers.TriggerException: Data out of range
    I use ucanaccess-4.0.1.jar, jackcess-2.1.6.jar and hsqldb.jar 2.3.1
    * All Classes and Database in My Github https://github.com/Abd-Elrazek/Program_Storage
    I want to use Christmas Calender with DateFormat (14/2/2019)only without time

    DB.java

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.sql.Date;
    // import java.util.Date;
    import java.text.SimpleDateFormat;
    import java.time.LocalDate;
    import java.util.Properties;
    
    public class DB {
    //Variables handle with database
        private Connection connection = null;
        private PreparedStatement ps = null;
    //Variables of Inputs
        private long Nbon = 2;
        private LocalDate Dateexchange = null;
        private Date date__;
        private String Typefuel = "dffdff";
        private long Quantitybon =3;
        private long Counter     = 4;
        private long Distance = 5;
        private String Namedriver = "dfdf";
        private long Nnote  = 6;
        private String Nameresponsible = "daaaaa";
        private String Codemachine = "dfdf33434";
    
    //Constructor
        public DB (){
        //variables of classes handle with database 
            date__ = new Date(2019, 2, 10);
        }
        //we can use either Constructor or set function for insert dat in this class 
        // public DB(long Nbon,Date Dateexchange,String Typefuel, long Quantitybon,long Counter,long Distance, String Namedriver,long Nnote, String Nameresponsible,String Codemachine)
        // {
         // this.Nbon = Nbon;
         // this.Dateexchange = Dateexchange;
         // this.Typefuel = Typefuel;
         // this.Quantitybon = Quantitybon;
         // this.Counter = Counter;
         // this.Distance = Distance;
         // this.Namedriver = Namedriver;
         // this.Nnote = Nnote;
         // this.Nameresponsible = Nameresponsible;
         // this.Codemachine = Codemachine;
        // }
    //Functions
    //setConnection func
        public Connection getConnection_F_DB(){
       //Step 1: Loading or registering Oracle JDBC driver class with ucanaccess
        try {
          Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
        }
        catch(ClassNotFoundException cnfex) {
            System.out.println("Problem in loading or registering MS Access JDBC driver");
            cnfex.printStackTrace();
        }
    
        //Step 2: Opening database connection
        try {
            String msAccDB = "db_main.accdb";
            String dbURL = "jdbc:ucanaccess://" + msAccDB; 
    
           //Step 2.A: Create and get connection using DriverManager class
            connection = DriverManager.getConnection(dbURL);
            if (connection != null){
             System.out.println("Connected to db...");
            }
    
        }catch(SQLException e){
          e.printStackTrace();
        }
        return connection;
        }
    
    //func InsertDate and retrieve True if data is inserted False if data not inserted 
        public boolean insertData(){
            try{
            //Step 2.B: Creating JDBC PreparedStatement class 
            ps = connection.prepareStatement("INSERT  INTO General_db (Nbon, Dateexchange, Typefuel, Quantitybon, Counter, Distance, Namedriver, Nnote, Nameresponsible, Codemachine)values(?,?,?,?,?,?,?,?,?,?)");
            ps.setLong(1, Nbon);
            ps.setDate(2, new Date(2000, 02,05));
            ps.setString(3, Typefuel);
            ps.setLong(4, Quantitybon);
            ps.setLong(5, Counter);
            ps.setLong(6, Distance);
            ps.setString(7, Namedriver);
            ps.setLong(8, Nnote);
            ps.setString(9, Nameresponsible);
            ps.setString(10, Codemachine);
            // Step 2.C: Executing SQL 
            int result = ps.executeUpdate();
            if (result != 0){
             return true;
            }
            }catch(SQLException sqlex){
                sqlex.printStackTrace();
            }
            finally {
    
                // Step 3: Closing database connection
                try {
                    if(null != connection) {
    
                        // cleanup resources, once after processing
                        ps.close();
                        System.out.println("Data inserted ...");
                        // and then finally close connection
                        connection.close();
                        System.out.println("Connection closed");
                    }
                }catch (SQLException sqlex) {
                    sqlex.printStackTrace();
                }
            }
            return false;
        }
    
         //funcs of set Vars
        public void setNbon(long nb){
         this.Nbon = nb;
        }
        public void setDateexchange(LocalDate da){
         this.Dateexchange =da; 
        }
        public void setTypefuel(String ty){
         this.Typefuel = ty;    
        }
        public void setQuantitybon(long qu){
         this.Quantitybon =  qu;    
        }
        public void setCounter(long co){
         this.Counter = co;
        }
        public void setDistance(long co){
         this.Distance = co;
        }
        public void setNamedriver(String na){
         this.Namedriver = na;
        }
        public void setNnote(long nn){
         this.Nnote = nn;
        }
        public void setNameresponsible(String naa){
         this.Nameresponsible = naa;    
        }
        public void setCodemachine(String co){
         this.Codemachine = co; 
        }
        //End funcs Set  
    
        //funcs of get Vars
        public long getNbon(){
         return Nbon;
        }
        public LocalDate getDateexchange(){
         return Dateexchange;   
        }
        public String getTypefuel(){
          return Typefuel;  
        }
        public long getQuantitybon(){
          return Quantitybon;   
        }
        public long getCounter(){
          return Counter;
        }
        public long getDistance(){
          return Distance;
        }
        public String getNamedriver(){
          return Namedriver;
        }
        public long getNnote(){
            return Nnote;
        }
        public String getNameresponsible(){
         return Nameresponsible;    
        }
        public String getCodemachine(){
         return Codemachine;    
        }
        //End funcs Get 
    
        // public static void main(String args []){
           // DB db = new DB();
           // if (db.getConnection_F_DB() != null && db.insertData()){
    
            // }    
        // }
    
    }
    
     

    Last edit: Abdelrazek Nageh 2019-02-14
  • Abdelrazek Nageh

    Thank you My sir...that's help me alot , if u don't mind to tell my how to insert Date from LocalDate..ps.setObject(2,mylocalDate); ... I try it showing Error
    is

    Gui running...
    Connected to db...
    Database opened in 3.856 seconds
    Selected date: 2019-02-20
    date_ from db.getDateexchange --> 2019-02-20
    net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.4 incompatible data type in conversion
            at net.ucanaccess.jdbc.UcanaccessPreparedStatement.setObject(UcanaccessPreparedStatement.java:672)
            at DB.insertData(DB.java:84)
            at Input_data_Controller.saveData(Input_data_Controller.java:146)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
            at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
            at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
            at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
            at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
            at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
            at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
            at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
            at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
            at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
            at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
            at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
            at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
            at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
            at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
            at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
            at javafx.event.Event.fireEvent(Event.java:198)
            at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
            at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
            at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
            at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
            at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
            at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
            at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:3
    )
            at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:2
    )
            at java.security.AccessController.doPrivileged(Native Method)
            at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:
    2)
            at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
            at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
            at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
            at com.sun.glass.ui.View.notifyMouse(View.java:937)
            at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
            at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
            at java.lang.Thread.run(Thread.java:748)
    Caused by: java.sql.SQLSyntaxErrorException: incompatible data type in conversion
            at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
            at org.hsqldb.jdbc.JDBCUtil.throwError(Unknown Source)
            at org.hsqldb.jdbc.JDBCPreparedStatement.setParameter(Unknown Source)
            at org.hsqldb.jdbc.JDBCPreparedStatement.setObject(Unknown Source)
            at net.ucanaccess.jdbc.UcanaccessPreparedStatement.setObject(UcanaccessPreparedStatement.java:669)
            ... 43 more
    Caused by: org.hsqldb.HsqlException: incompatible data type in conversion
            at org.hsqldb.error.Error.error(Unknown Source)
            at org.hsqldb.error.Error.error(Unknown Source)
            at org.hsqldb.types.DateTimeType.convertJavaToSQL(Unknown Source)
            ... 46 more
    Data inserted ...
    Connection closed
    db.insertData return --> false
    

    thank u advance

     

    Last edit: Abdelrazek Nageh 2019-02-14
  • Gord Thompson

    Gord Thompson - 2019-02-14

    UCanAccess 4.x depends on older versions of Jackcess and HSQLDB that do not support the java.time objects introduced in Java_8, e.g., LocalDateTime. The next release of UCanAccess, version 5.0, will be based on newer versions of Jackcess and HSQLDB that support those features.

     
    👍
    1
  • Abdelrazek Nageh

    thank you Dev ^_^ that's nice news

     
  • Abdelrazek Nageh

    HI Gord,
    First : I compilled all files *.java and run correctly at first , when i run again (in same minute mostly) throw Exception WHY??!!! But after +2 minute excute correctly and nothing error and running .....Is that problem with JVM or Memory I ask


    Code :

    import javafx.scene.control.Button;
    import javafx.scene.control.ChoiceBox;
    import javafx.scene.control.DatePicker;
    import javafx.scene.control.Label;
    import javafx.scene.control.RadioButton;
    import javafx.scene.control.Separator;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextField;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.effect.Blend;
    import javafx.scene.effect.Reflection;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.Pane;
    import javafx.scene.text.Font;
    import javafx.scene.control.ToggleGroup;
    import java.time.LocalDate;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.Connection;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import java.sql.Date;
    import javafx.scene.Cursor;
    import javafx.fxml.Initializable;
    import java.net.URL;
    import java.util.ResourceBundle;
    import java.io.IOException;
    import java.sql.SQLException;
    //import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    
    public class Input_data_Controller implements Initializable{
        private Connection con_db = null;
    
    //Variables
        @FXML
        private TableView<Table_View> viewtable;
        @FXML
        private TableColumn<Table_View,Integer> serialn_col;
        @FXML
        private TableColumn<Table_View,Integer> nbon_col;
        @FXML
        private TableColumn<Table_View,Date> dateexchane_col;
        @FXML
        private TableColumn<Table_View,String> typefuel_col;
        @FXML
        private TableColumn<Table_View,Integer> quantitybon_col;
        @FXML
        private TableColumn<Table_View,Integer> counter_col;
        @FXML
        private TableColumn<Table_View,Integer> distance_col;
        @FXML
        private TableColumn<Table_View,String> namedriver_col;
        @FXML
        private TableColumn<Table_View,Integer> nnote_col;
        @FXML
        private TableColumn<Table_View,String> nameresponsible_col;
        @FXML
        private TableColumn<Table_View,String> codemachine_col;
        //TextField vars
        @FXML
        private TextField nbon_txt;
        @FXML
        private TextField quantitybon_txt;
        @FXML
        private TextField counter_txt;
        @FXML
        private TextField namedriver_txt;
        @FXML
        private TextField nnote_txt;
        @FXML
        private TextField nameresponsible_txt;
        @FXML
        private TextField codemachine_txt;
        //DatePicker var
        @FXML
        private DatePicker dateexchange_datepicker;
        //Radio Button vars
        @FXML
        private RadioButton gas_radiobtn;
        @FXML
        private RadioButton solar_radiobtn;
        private ToggleGroup group = new ToggleGroup();
        private String store_radio_val = "initialize";
    
        //ChoiceBox var
        @FXML
        private ChoiceBox codemachine_choicebox;
    
        ObservableList<Table_View> table_view_list = FXCollections.observableArrayList();
        Date date_ob = null;
        LocalDate date_ = null;
        private DB db = new DB();
    
        private PreparedStatement ps = null;
    
    //funcions 
        // this function used to initialize my variables
        @Override
        public void initialize(URL url, ResourceBundle rb) {
          long t0 = System.nanoTime();
          con_db = db.getConnection_F_DB();
          try{ 
            ResultSet rs =con_db.createStatement().executeQuery("SELECT * FROM General_db");
            while(rs.next()){
            table_view_list.add(new Table_View(rs.getInt("Serialn"), rs.getInt("Nbon"),rs.getDate("Dateexchange"),rs.getString("Typefuel"),rs.getInt("Quantitybon"),rs.getInt("Counter"),rs.getInt("Distance"),rs.getString("Namedriver"),rs.getInt("Nnote"),rs.getString("Nameresponsible"),rs.getString("Codemachine")));
            }
            System.out.printf("Database opened in %.3f seconds%n",((System.nanoTime()-t0)/1000000000.0));
          }catch(SQLException e){
            e.printStackTrace();
          }
          serialn_col.setCellValueFactory(new PropertyValueFactory<>("Serialn"));
          nbon_col.setCellValueFactory(new PropertyValueFactory<>("Nbon"));
          typefuel_col.setCellValueFactory(new PropertyValueFactory<>("Typefuel"));
          quantitybon_col.setCellValueFactory(new PropertyValueFactory<>("Quantitybon"));
          counter_col.setCellValueFactory(new PropertyValueFactory<>("Counter"));
          distance_col.setCellValueFactory(new PropertyValueFactory<>("Distance"));
          namedriver_col.setCellValueFactory(new PropertyValueFactory<>("Namedriver"));
          nnote_col.setCellValueFactory(new PropertyValueFactory<>("Nnote"));
          nameresponsible_col.setCellValueFactory(new PropertyValueFactory<>("Nameresponsible"));
          codemachine_col.setCellValueFactory(new PropertyValueFactory<>("Codemachine"));
          viewtable.setItems(table_view_list);
    
          //initialize of store_radio_val by Banzeeen
          gas_radiobtn.setSelected(true);
          store_radio_val = "بنزين";
        }//end initialize variables
    
        //Save func
        @FXML
        public void saveData(){
         date_ = dateexchange_datepicker.getValue();
         System.out.println("year "+ date_.getYear());
         System.out.println("Month "+ date_.getMonthValue());
         System.out.println("day "+ date_.getDayOfMonth());
         date_ob = new Date((date_.getYear()-1900), date_.getMonthValue()-1,date_.getDayOfMonth());
         try{
            //Step 2.B: Creating JDBC PreparedStatement class 
            ps = con_db.prepareStatement("INSERT  INTO General_db (Nbon, Dateexchange, Typefuel, Quantitybon, Counter, Distance, Namedriver, Nnote, Nameresponsible, Codemachine)values(?,?,?,?,?,?,?,?,?,?)");
            ps.setLong(1, Integer.valueOf(nbon_txt.getText()));
            ps.setDate(2,date_ob);
            ps.setString(3, store_radio_val);
            ps.setLong(4, Integer.valueOf(quantitybon_txt.getText()));
            ps.setLong(5, Integer.valueOf(counter_txt.getText()));
            ps.setLong(6, Integer.valueOf(quantitybon_txt.getText()));
            ps.setString(7,namedriver_txt.getText());
            ps.setLong(8, Integer.valueOf(nnote_txt.getText()));
            ps.setString(9, nameresponsible_txt.getText());
            ps.setString(10, codemachine_txt.getText());
            // Step 2.C: Executing SQL 
            int result = ps.executeUpdate();
            if (result != 0){
              System.out.println("Data inserted correctly");
            }
            }catch(SQLException sqlex){
                sqlex.printStackTrace();
            }
            finally {
    
                // Step 3: Closing database connection
                try {
                    if(null != db.getConnection_F_DB()) {
    
                        // cleanup resources, once after processing
                        ps.close();
                        System.out.println("Data inserted ...");
                        // and then finally close connection
                        db.getConnection_F_DB().close();
                        System.out.println("Connection closed");
                    }
                }catch (SQLException sqlex) {
                    sqlex.printStackTrace();
                }
            }
        }
        @FXML
        //Update func
        public void updateData(){
    
        }
        @FXML
        //Delete func
        public void deleteData(){
    
        }
    
    }
    

    Error:

    C:\All Training\storage>java Main
    Gui running...
    Connected to db...
    Database opened in 3.980 seconds
    year 2019
    Month 2
    day 13
    Data inserted correctly
    Connected to db...
    Data inserted ...
    Connected to db...
    Connection closed
    
    C:\All Training\storage>java Main
    Gui running...
    Connected to db...
    Database opened in 3.928 seconds
    year 2019
    Month 2
    day 17
    net.ucanaccess.jdbc.UcanaccessSQLException: UCAExc:::4.0.1 net.ucanaccess.triggers.TriggerException: Data out of ran
    ge net.ucanaccess.triggers.TriggerException: Data out of range
            at net.ucanaccess.jdbc.UcanaccessPreparedStatement.executeUpdate(UcanaccessPreparedStatement.java:256)
            at Input_data_Controller.saveData(Input_data_Controller.java:157)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
            at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
            at java.lang.reflect.Method.invoke(Method.java:498)
            at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
            at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
            at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
            at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
            at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
            at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
            at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
            at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
            at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
            at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
            at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
            at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
            at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
            at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
            at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
            at javafx.event.Event.fireEvent(Event.java:198)
            at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
            at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
            at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
            at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
            at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
            at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
            at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394
    )
            at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295
    )
            at java.security.AccessController.doPrivileged(Native Method)
            at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:43
    2)
            at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
            at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
            at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
            at com.sun.glass.ui.View.notifyMouse(View.java:937)
            at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
            at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
            at java.lang.Thread.run(Thread.java:748)
    Caused by: java.sql.SQLException: net.ucanaccess.triggers.TriggerException: Data out of range net.ucanaccess.trigger
    s.TriggerException: Data out of range
            at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
            at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
            at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
            at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
            at net.ucanaccess.jdbc.ExecuteUpdate.executeWrapped(ExecuteUpdate.java:65)
            at net.ucanaccess.jdbc.AbstractExecute.executeBase(AbstractExecute.java:208)
            at net.ucanaccess.jdbc.ExecuteUpdate.execute(ExecuteUpdate.java:50)
            at net.ucanaccess.jdbc.UcanaccessPreparedStatement.executeUpdate(UcanaccessPreparedStatement.java:253)
            ... 42 more
    Caused by: org.hsqldb.HsqlException: net.ucanaccess.triggers.TriggerException: Data out of range
            at org.hsqldb.error.Error.error(Unknown Source)
            at org.hsqldb.result.Result.newErrorResult(Unknown Source)
            at org.hsqldb.StatementDMQL.execute(Unknown Source)
            at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
            at org.hsqldb.Session.execute(Unknown Source)
            ... 48 more
    Caused by: net.ucanaccess.triggers.TriggerException: Data out of range
            at net.ucanaccess.triggers.TriggerInsert.fire(TriggerInsert.java:38)
            at org.hsqldb.TriggerDef.pushPair(Unknown Source)
            at org.hsqldb.Table.fireTriggers(Unknown Source)
            at org.hsqldb.StatementDML.insertSingleRow(Unknown Source)
            at org.hsqldb.StatementInsert.getResult(Unknown Source)
            ... 51 more
    Connected to db...
    Data inserted ...
    Connected to db...
    Connection closed
    

    Can you helep me ?? I am sorry I tired you with me but I spent more than a day solving this problem, it 's a strange problem

     
  • Gord Thompson

    Gord Thompson - 2019-02-15

    Perhaps try printing out all of the parameter values. The Date value itself may not be the culprit.

     
    ❤️
    1
  • Abdelrazek Nageh

    when I discover the error in Library of Ucanaccess.jar by decompiler the Class of Persist2Jet.class
    it rturn

    Caused by: net.ucanaccess.triggers.TriggerException: Data out of range because val 3333
            at net.ucanaccess.triggers.TriggerInsert.fire(TriggerInsert.java:38)
            at org.hsqldb.TriggerDef.pushPair(Unknown Source)
            at org.hsqldb.Table.fireTriggers(Unknown Source)
            at org.hsqldb.StatementDML.insertSingleRow(Unknown Source)
            at org.hsqldb.StatementInsert.getResult(Unknown Source)
    

    In Class Persist2Let Code as you Know :

    package net.ucanaccess.converters;
    
    import com.healthmarketscience.jackcess.Column;
    import com.healthmarketscience.jackcess.ColumnBuilder;
    import com.healthmarketscience.jackcess.Cursor;
    import com.healthmarketscience.jackcess.DataType;
    import com.healthmarketscience.jackcess.Database;
    import com.healthmarketscience.jackcess.IndexBuilder;
    //import com.healthmarketscience.jackcess.IndexBuilder.Column;
    import com.healthmarketscience.jackcess.PropertyMap;
    import com.healthmarketscience.jackcess.RelationshipBuilder;
    import com.healthmarketscience.jackcess.Row;
    import com.healthmarketscience.jackcess.Table;
    import com.healthmarketscience.jackcess.TableBuilder;
    import com.healthmarketscience.jackcess.impl.DatabaseImpl;
    import java.io.File;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.DatabaseMetaData;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.Timestamp;
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.GregorianCalendar;
    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Locale;
    import java.util.Map;
    import java.util.Set;
    import java.util.TimeZone;
    import java.util.TreeMap;
    import net.ucanaccess.commands.InsertCommand;
    import net.ucanaccess.complex.ComplexBase;
    import net.ucanaccess.complex.UnsupportedValue;
    import net.ucanaccess.jdbc.DBReference;
    import net.ucanaccess.jdbc.NormalizedSQL;
    import net.ucanaccess.jdbc.OnReloadReferenceListener;
    import net.ucanaccess.jdbc.UcanaccessConnection;
    import net.ucanaccess.jdbc.UcanaccessDatabaseMetadata;
    import net.ucanaccess.jdbc.UcanaccessSQLException;
    import net.ucanaccess.jdbc.UcanaccessSQLException.ExceptionMessages;
    import org.hsqldb.HsqlDateTime;
    import org.hsqldb.SessionInterface;
    import org.hsqldb.jdbc.JDBCConnection;
    import org.hsqldb.types.BlobData;
    import org.hsqldb.types.JavaObjectData;
    import org.hsqldb.types.TimestampData;
    
    public class Persist2Jet
    {
      private static HashMap<String, List<String>> columnNamesCache = new HashMap();
    
      static
      {
        DBReference.addOnReloadRefListener(new OnReloadReferenceListener()
        {
          public void onReload()
          {
            Persist2Jet.columnNamesCache.clear();
          }
        });
      }
    
      public Map<String, Object> getRowPattern(Object[] varr, Table t)
        throws SQLException
      {
        String ntn = SQLConverter.basicEscapingIdentifier(t.getName()).toUpperCase();
    
        LinkedHashMap<String, Object> vl = new LinkedHashMap();
        int i = 0;
        Iterator<String> it = getColumnNames(ntn).iterator();
        while (it.hasNext()) {
          vl.put(it.next(), varr[(i++)]);
        }
        if (i == 0) {
          throw new SQLException("Cannot read table's metadata");
        }
        return escapeIdentifiers(vl, t);
      }
    
      public Object[] getValues(Map<String, Object> rowPattern, Table t)
        throws SQLException
      {
        Object[] values = new Object[rowPattern.size()];
        int i = 0;
        for (Object obj : rowPattern.values()) {
          values[(i++)] = obj;
        }
        return values;
      }
    
      private List<String> getColumnNames(String ntn)
        throws SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        ntn = UcanaccessDatabaseMetadata.normalizeName(ntn);
        String pref = conn.getDbIO().getFile().getAbsolutePath();
        Connection conq = conn.getHSQLDBConnection();
        String key = pref + ntn;
        if (!columnNamesCache.containsKey(key))
        {
          ArrayList<String> ar = new ArrayList();
          ResultSet rs = conq.getMetaData().getColumns(null, "PUBLIC", ntn, null);
    
          TreeMap<Integer, String> tm = new TreeMap();
          while (rs.next())
          {
            String cbase = rs.getString("COLUMN_NAME");
            Integer i = Integer.valueOf(rs.getInt("ORDINAL_POSITION"));
            tm.put(i, cbase.toUpperCase());
          }
          ar.addAll(tm.values());
          columnNamesCache.put(key, ar);
        }
        return (List)columnNamesCache.get(key);
      }
    
      private List<String> getColumnNamesCreate(String ntn)
        throws SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        ArrayList<String> ar = new ArrayList();
        ResultSet rs = conn.getMetaData().getColumns(null, "PUBLIC", ntn, null);
        while (rs.next())
        {
          String cbase = rs.getString("COLUMN_NAME");
          ar.add(cbase);
        }
        return ar;
      }
    
      public void convertRowTypes(Object[] values, Table t)
        throws SQLException
      {
        try
        {
          List<? extends Column> columns = t.getColumns();
          Iterator<? extends Column> it = columns.iterator();
          for (int i = 0; i < values.length; i++)
          {
            Object value = values[i];
            Column column = (Column)it.next();
            if (value != null)
            {
              if (((value instanceof TimestampData)) && 
                (column.getType().equals(DataType.SHORT_DATE_TIME)))
              {
                TimestampData ts = (TimestampData)value;
                TimeZone zone = TimeZone.getDefault();
                GregorianCalendar cal = new GregorianCalendar(zone);
                long millis = HsqlDateTime.convertMillisToCalendar(cal, ts.getSeconds() * 1000L);
    
                Timestamp val = new Timestamp(millis);
    
                val.setNanos(ts.getNanos());
                values[i] = val;
              }
              if ((value instanceof BlobData))
              {
                BlobData bd = (BlobData)value;
                JDBCConnection hsqlConn = (JDBCConnection)UcanaccessConnection.getCtxConnection().getHSQLDBConnection();
    
                SessionInterface si = hsqlConn.getSession();
                long length = bd.length(si);
                values[i] = ((BlobData)value).getBytes(si, 0L, (int)length);
              }
              if ((value instanceof JavaObjectData))
              {
                JavaObjectData jod = (JavaObjectData)value;
                Object obj = jod.getObject();
                if (((obj instanceof ComplexBase[])) && (!(obj instanceof UnsupportedValue[]))) {
                  values[i] = obj;
                } else {
                  throw new UcanaccessSQLException(UcanaccessSQLException.ExceptionMessages.UNSUPPORTED_TYPE);
                }
              }
              if (column.getType().equals(DataType.BYTE))
              {
                int vl = ((Integer)value).intValue();
                if ((vl < 0) || (vl > 256)) {
                  throw new SQLException("Data out of range because val " +vl);
                }
              }
            }
          }
        }
        catch (Exception e)
        {
          throw new SQLException(e.getMessage());
        }
      }
    
      private LinkedHashMap<String, Object> escapeIdentifiers(LinkedHashMap<String, Object> map, Table t)
      {
        List<? extends Column> colums = t.getColumns();
        LinkedHashMap<String, Object> vl = new LinkedHashMap();
        for (Column cl : colums)
        {
          String key = cl.getName();
          String keyu = key.toUpperCase();
          String ekey = map.containsKey(keyu) ? keyu : SQLConverter.escapeIdentifier(key).toUpperCase();
          if ((!map.containsKey(ekey)) && (map.containsKey(ekey.substring(1, ekey.length() - 1)))) {
            ekey = ekey.substring(1, ekey.length() - 1);
          }
          vl.put(key, map.get(ekey));
        }
        return vl;
      }
    
      private String getNormalizedName(String name, Map<String, String> columnMap)
      {
        if (columnMap == null) {
          return name;
        }
        return columnMap.containsKey(name) ? (String)columnMap.get(name) : name;
      }
    
      private ColumnBuilder getColumn(ResultSet rs, int seq, String tableName, Map<String, String> columnMap, String[] types)
        throws SQLException
      {
        String name = rs.getString("COLUMN_NAME");
        String nname = getNormalizedName(name, columnMap);
        ColumnBuilder cb = new ColumnBuilder(nname);
        short length = (short)rs.getInt("COLUMN_SIZE");
        byte scale = (byte)rs.getInt("DECIMAL_DIGITS");
        DataType dt = null;
        if ((length == 0) && (types != null))
        {
          if (types[seq].equalsIgnoreCase(TypesMap.AccessType.MEMO.name()))
          {
            dt = DataType.MEMO;
            cb.setType(dt);
          }
          if (types[seq].equalsIgnoreCase(TypesMap.AccessType.TEXT.name()))
          {
            dt = DataType.TEXT;
            cb.setType(dt);
          }
        }
        if ((types != null) && (seq < types.length) && (types[seq] != null) && ((types[seq].equalsIgnoreCase(TypesMap.AccessType.LONG.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.BYTE.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.CURRENCY.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.INTEGER.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.SINGLE.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.DOUBLE.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.YESNO.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.DATETIME.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.COUNTER.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.AUTOINCREMENT.name()))))
        {
          dt = TypesMap.map2Jackcess(TypesMap.AccessType.valueOf(types[seq].toUpperCase(Locale.US)));
    
          cb.setType(dt);
          cb.setLengthInUnits((short)dt.getFixedSize());
        }
        if (dt == null)
        {
          if ((types != null) && (seq < types.length) && (types[seq] != null) && (types[seq].equalsIgnoreCase(TypesMap.AccessType.NUMERIC.name()))) {
            dt = DataType.NUMERIC;
          } else {
            dt = DataType.fromSQLType(rs.getInt("DATA_TYPE"), length);
          }
          cb.setType(dt);
          if ((length > 0) && (dt.equals(DataType.TEXT))) {
            cb.setLengthInUnits(length);
          }
          if (scale > 0)
          {
            cb.setScale(scale);
            if (length > 0) {
              cb.setPrecision(length);
            }
          }
        }
        if ((types != null) && (seq < types.length))
        {
          if ((types[seq].equalsIgnoreCase(TypesMap.AccessType.COUNTER.name())) || (types[seq].equalsIgnoreCase(TypesMap.AccessType.AUTOINCREMENT.name()))) {
            cb.setAutoNumber(true);
          }
          if (types[seq].equalsIgnoreCase(TypesMap.AccessType.GUID.name()))
          {
            cb.setType(DataType.GUID);
            cb.setAutoNumber(true);
          }
        }
        return cb;
      }
    
      private ColumnBuilder getColumn(String tableName, Map<String, String> columnMap, String[] types)
        throws SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        String columnName = (String)columnMap.keySet().iterator().next();
        ResultSet rs = conn.getHSQLDBConnection().getMetaData().getColumns(null, "PUBLIC", tableName.toUpperCase(), SQLConverter.preEscapingIdentifier(columnName));
        if (rs.next()) {
          return getColumn(rs, 0, tableName, columnMap, types);
        }
        return null;
      }
    
      private Collection<ColumnBuilder> getColumns(String tableName, Map<String, String> columnMap, String[] types)
        throws SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        TreeMap<Integer, ColumnBuilder> ordm = new TreeMap();
        ResultSet rs = conn.getHSQLDBConnection().getMetaData().getColumns(null, "PUBLIC", tableName.toUpperCase(), null);
        while (rs.next())
        {
          int seq = rs.getInt("ORDINAL_POSITION") - 1;
          ordm.put(Integer.valueOf(seq), getColumn(rs, seq, tableName, columnMap, types));
        }
        return ordm.values();
      }
    
      private List<IndexBuilder> getIndexBuilders(String tableName, Map<String, String> columnMap)
        throws SQLException
      {
        ArrayList<IndexBuilder> arcl = new ArrayList();
        addIndexBuildersSimple(tableName, columnMap, arcl);
        return arcl;
      }
    
      private void checkPK(List<IndexBuilder> arcl, IndexBuilder ibpk)
      {
        if (ibpk == null) {
          return;
        }
        Iterator<IndexBuilder> itib = arcl.iterator();
        List<IndexBuilder.Column> clspk = ibpk.getColumns();
        ArrayList<String> columnNamesPK = new ArrayList();
        for (IndexBuilder.Column clpk : clspk) {
          columnNamesPK.add(clpk.getName().toUpperCase());
        }
        while (itib.hasNext())
        {
          IndexBuilder ib = (IndexBuilder)itib.next();
          List<IndexBuilder.Column> cls = ib.getColumns();
          if (cls.size() == clspk.size())
          {
            boolean clsPK = true;
            for (IndexBuilder.Column cl : cls) {
              if (!columnNamesPK.contains(cl.getName().toUpperCase()))
              {
                clsPK = false;
                break;
              }
            }
            if (clsPK) {
              itib.remove();
            }
          }
        }
      }
    
      private IndexBuilder getIndexBuilderPK(String tableName, Map<String, String> columnMap)
        throws SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        ResultSet pkrs = conn.getMetaData().getPrimaryKeys(null, "PUBLIC", tableName.toUpperCase());
    
        IndexBuilder indpk = null;
        while (pkrs.next())
        {
          if (indpk == null)
          {
            String indexName = "PrimaryKey";
            indpk = new IndexBuilder(indexName);
            indpk.setPrimaryKey();
          }
          indpk.addColumns(new String[] { getNormalizedName(pkrs.getString("COLUMN_NAME"), columnMap) });
        }
        return indpk;
      }
    
      private void addIndexBuildersSimple(String tableName, Map<String, String> columnMap, ArrayList<IndexBuilder> arcl)
        throws SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        ResultSet idxrs = conn.getMetaData().getIndexInfo(null, "PUBLIC", tableName, false, false);
    
        HashMap<String, IndexBuilder> hi = new HashMap();
        for (IndexBuilder ib : arcl) {
          hi.put(ib.getName(), ib);
        }
        while (idxrs.next())
        {
          String colName = getNormalizedName(idxrs.getString("COLUMN_NAME"), columnMap);
    
          String indexName = idxrs.getString("INDEX_NAME");
          boolean unique = !idxrs.getBoolean("NON_UNIQUE");
          String ad = idxrs.getString("ASC_OR_DESC");
          boolean asc = (ad == null) || (ad.equals("A"));
          if (!hi.containsKey(indexName))
          {
            IndexBuilder ib = new IndexBuilder(indexName);
            if (unique) {
              ib.setUnique();
            }
            arcl.add(ib);
            hi.put(indexName, ib);
          }
          IndexBuilder toIdx = (IndexBuilder)hi.get(indexName);
          toIdx.addColumns(asc, new String[] { colName });
        }
      }
    
      private void saveColumnsDefaults(String[] defaults, Boolean[] required, Column cl, int j)
        throws IOException
      {
        PropertyMap map = cl.getProperties();
        if ((defaults != null) && (j < defaults.length) && (defaults[j] != null)) {
          map.put("DefaultValue", DataType.TEXT, defaults[j]);
        }
        if ((required != null) && (j < required.length) && (required[j] != null) && (!cl.isAutoNumber())) {
          map.put("Required", DataType.BOOLEAN, required[j]);
        }
        map.save();
      }
    
      private void saveColumnsDefaults(String[] defaults, Boolean[] required, Table table)
        throws IOException
      {
        List<? extends Column> cols = table.getColumns();
        int j = 0;
        if ((defaults != null) || (required != null)) {
          for (Column cl : cols)
          {
            saveColumnsDefaults(defaults, required, cl, j);
            j++;
          }
        }
      }
    
      private String escape4Hsqldb(String tn)
      {
        if (((tn.startsWith("[")) && (tn.endsWith("]"))) || ((tn.startsWith("`")) && (tn.endsWith("`"))))
        {
          tn = tn.substring(1, tn.length() - 1);
          return SQLConverter.preEscapingIdentifier(tn);
        }
        return tn;
      }
    
      private String escape4Access(String tn)
      {
        if (((tn.startsWith("[")) && (tn.endsWith("]"))) || ((tn.startsWith("`")) && (tn.endsWith("`")))) {
          return tn.substring(1, tn.length() - 1);
        }
        return tn;
      }
    
      public void createTable(String tableName, Map<String, String> columnMap, String[] types, String[] defaults, Boolean[] notNulls)
        throws IOException, SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        Database db = conn.getDbIO();
        String tn = escape4Access(tableName);
        String ntn = escape4Hsqldb(tableName);
        Metadata mtd = new Metadata(conn.getHSQLDBConnection());
        TableBuilder tb = new TableBuilder(tn);
        int idTable = mtd.newTable(tn, ntn, Metadata.Types.TABLE).intValue();
        Collection<ColumnBuilder> lcb = getColumns(ntn, columnMap, types);
        tb.addColumns(lcb);
        for (ColumnBuilder cb : lcb) {
          mtd.newColumn(cb.getName(), SQLConverter.preEscapingIdentifier(cb.getName()), cb.getType().name(), Integer.valueOf(idTable));
        }
        List<IndexBuilder> arcl = getIndexBuilders(ntn, columnMap);
    
        IndexBuilder ibpk = getIndexBuilderPK(ntn, columnMap);
    
        checkPK(arcl, ibpk);
        if (ibpk != null) {
          arcl.add(ibpk);
        }
        for (IndexBuilder ixb : arcl) {
          tb.addIndex(ixb);
        }
        Table table = tb.toTable(db);
        saveColumnsDefaults(defaults, notNulls, table);
        LoadJet lj = new LoadJet(conn.getHSQLDBConnection(), db);
        lj.loadDefaultValues(table);
        createForeignKeys(tableName);
        Statement st = null;
        try
        {
          st = conn.createStatement();
          ResultSet rs = st.executeQuery("SELECT * FROM " + tableName);
          List<String> clns = getColumnNamesCreate(tn);
          while (rs.next())
          {
            Object[] record = new Object[clns.size()];
            int i = 0;
            for (String columnName : clns) {
              record[(i++)] = rs.getObject(columnName);
            }
            new InsertCommand(table, record, null).persist();
          }
        }
        finally
        {
          if (st != null) {
            st.close();
          }
        }
      }
    
      public void dropTable(String tableName)
        throws IOException, SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        Database db = conn.getDbIO();
        tableName = escape4Access(tableName);
        Table t = db.getTable(tableName);
        if (t == null) {
          return;
        }
        Metadata mt = new Metadata(conn.getHSQLDBConnection());
        mt.dropTable(t.getName());
        Cursor c = t.getDefaultCursor();
        while (c.getNextRow() != null) {
          c.deleteCurrentRow();
        }
        DatabaseImpl dbi = (DatabaseImpl)db;
        Table cat = dbi.getSystemCatalog();
    
        Cursor catc = cat.getDefaultCursor();
        Map<String, Object> row;
        while ((row = catc.getNextRow()) != null)
        {
          String name = (String)row.get("Name");
          if ((name != null) && (name.equalsIgnoreCase(tableName)))
          {
            Integer id = (Integer)row.get("Id");
            Table tsa = db.getSystemTable("MSysACEs");
            HashMap<String, Object> rowtsa = new HashMap();
            rowtsa.put("ObjectId", id);
            Cursor cur = tsa.getDefaultCursor();
            if (cur.findNextRow(rowtsa)) {
              cur.deleteCurrentRow();
            }
            catc.deleteCurrentRow();
            Table srs = db.getSystemTable("MSysRelationships");
            Cursor srsc = srs.getDefaultCursor();
            while ((row = srsc.getNextRow()) != null)
            {
              String szObject = (String)row.get("szObject");
              String szReferencedObject = (String)row.get("szReferencedObject");
              if (((szObject != null) && (szObject.equalsIgnoreCase(tableName))) || ((szReferencedObject != null) && (szReferencedObject.equalsIgnoreCase(tableName)))) {
                srsc.deleteCurrentRow();
              }
            }
          }
        }
        conn.reloadDbIO();
      }
    
      public void renameTable(String oldTableName, String newTableName)
        throws IOException, SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        Database db = conn.getDbIO();
        oldTableName = escape4Access(oldTableName);
        String tn = escape4Access(newTableName);
        String ntn = escape4Hsqldb(newTableName);
        Table t = db.getTable(oldTableName);
        if (t == null) {
          return;
        }
        Metadata mt = new Metadata(conn.getHSQLDBConnection());
        mt.rename(t.getName(), tn, ntn);
        DatabaseImpl dbi = (DatabaseImpl)db;
        Table cat = dbi.getSystemCatalog();
    
        Cursor catc = cat.getDefaultCursor();
        Map<String, Object> row;
        while ((row = catc.getNextRow()) != null)
        {
          String name = (String)row.get("Name");
          if ((name != null) && (name.equalsIgnoreCase(oldTableName)))
          {
            Integer id = (Integer)row.get("Id");
            HashMap<String, Object> rowtsa = new HashMap();
            rowtsa.put("ObjectId", id);
            Row r = catc.getCurrentRow();
            r.put("Name", tn);
            catc.updateCurrentRowFromMap(r);
            Table srs = db.getSystemTable("MSysRelationships");
            Cursor srsc = srs.getDefaultCursor();
            while ((row = srsc.getNextRow()) != null)
            {
              String szObject = (String)row.get("szObject");
              String szReferencedObject = (String)row.get("szReferencedObject");
    
              boolean updated = false;
              if ((szObject != null) && (szObject.equalsIgnoreCase(oldTableName)))
              {
                row.put("szObject", tn);
                updated = true;
              }
              if ((szReferencedObject != null) && (szReferencedObject.equalsIgnoreCase(oldTableName)))
              {
                row.put("szReferencedObject", tn);
                updated = true;
              }
              if (updated) {
                srsc.updateCurrentRowFromMap(row);
              }
            }
          }
        }
        conn.reloadDbIO();
      }
    
      public void addColumn(String tableName, String columnName, Map<String, String> columnMap, String[] types, String[] defaults, Boolean[] notNulls)
        throws IOException, SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        Database db = conn.getDbIO();
        String tn = escape4Access(tableName);
        String ntn = escape4Hsqldb(tableName);
        Metadata mtd = new Metadata(conn.getHSQLDBConnection());
        ColumnBuilder cb = getColumn(ntn, columnMap, types);
        Table t = db.getTable(tn);
        Column cl = cb.addToTable(t);
    
        int idTable = mtd.getTableId(ntn.toUpperCase()).intValue();
        mtd.newColumn(cb.getName(), SQLConverter.preEscapingIdentifier(cb.getName()), cb.getType().name(), Integer.valueOf(idTable));
    
        saveColumnsDefaults(defaults, notNulls, cl, 0);
        updateNewColumn2Defaut(tableName, columnName, t, cl);
        setHsqldbNotNull(tableName, columnName, types[0], cl);
        conn.reloadDbIO();
      }
    
      private void setHsqldbNotNull(String tableName, String columnName, String type, Column cl)
        throws SQLException, IOException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        Boolean req = (Boolean)cl.getProperties().getValue("Required");
    
        req = Boolean.valueOf((req != null) && (req.booleanValue()));
        Statement stNN = null;
        try
        {
          if (req.booleanValue())
          {
            stNN = conn.getHSQLDBConnection().createStatement();
            stNN.execute(SQLConverter.convertSQL("ALTER TABLE " + tableName + " ALTER COLUMN " + columnName + " SET NOT NULL ").getSql());
          }
        }
        finally
        {
          if (stNN != null) {
            stNN.close();
          }
        }
      }
    
      private void updateNewColumn2Defaut(String tableName, String columnName, Table t, Column cl)
        throws SQLException, IOException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        LoadJet lj = new LoadJet(conn.getHSQLDBConnection(), conn.getDbIO());
        lj.loadDefaultValues(cl);
        String default4SQL = lj.defaultValue4SQL(cl);
        PreparedStatement ps = null;
        Object defObj = lj.tryDefault(default4SQL);
        conn.setFeedbackState(true);
        if (default4SQL != null)
        {
          for (Row row : t)
          {
            row.put(cl.getName(), defObj);
            t.updateRow(row);
          }
          conn.getDbIO().flush();
        }
        if ((default4SQL != null) || (cl.getType().equals(DataType.BOOLEAN))) {
          try
          {
            defObj = (default4SQL == null) && (cl.getType().equals(DataType.BOOLEAN)) ? Boolean.FALSE : defObj;
            ps = conn.getHSQLDBConnection().prepareStatement(SQLConverter.convertSQL("UPDATE " + tableName + " SET " + columnName + "=" + "?").getSql());
    
            ps.setObject(1, defObj);
            ps.executeUpdate();
          }
          finally
          {
            if (ps != null) {
              ps.close();
            }
          }
        }
        conn.setFeedbackState(false);
      }
    
      public void createIndex(String tableName, String indexName)
        throws IOException, SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        Database db = conn.getDbIO();
        String ntn = escape4Hsqldb(tableName);
        String idn = escape4Hsqldb(indexName);
        String tn = escape4Access(tableName);
        String in = escape4Access(indexName);
        Table t = db.getTable(tn);
    
        ResultSet idxrs = conn.getHSQLDBConnection().getMetaData().getIndexInfo(null, "PUBLIC", ntn.toUpperCase(), false, false);
    
        boolean asc = false;
        ArrayList<String> cols = new ArrayList();
        IndexBuilder ib = new IndexBuilder(in);
        while (idxrs.next())
        {
          String dbIdxName = idxrs.getString("INDEX_NAME");
          if (dbIdxName.equalsIgnoreCase(idn))
          {
            boolean unique = !idxrs.getBoolean("NON_UNIQUE");
            if (unique) {
              ib.setUnique();
            }
            String colName = idxrs.getString("COLUMN_NAME");
            Metadata mt = new Metadata(conn);
            colName = mt.getColumnName(ntn, colName);
            String ad = idxrs.getString("ASC_OR_DESC");
            asc = (ad == null) || (ad.equals("A"));
            cols.add(colName);
          }
        }
        ib.addColumns(asc, (String[])cols.toArray(new String[cols.size()])).addToTable(t);
      }
    
      public void createPrimaryKey(String tableName)
        throws IOException, SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        Database db = conn.getDbIO();
        String ntn = escape4Hsqldb(tableName);
        String tn = escape4Access(tableName);
        Table t = db.getTable(tn);
        ResultSet pkrs = conn.getHSQLDBConnection().getMetaData().getPrimaryKeys(null, null, ntn.toUpperCase());
    
        ArrayList<String> cols = new ArrayList();
        IndexBuilder ib = new IndexBuilder("PrimaryKey");
        ib.setPrimaryKey();
        while (pkrs.next())
        {
          String colName = pkrs.getString("COLUMN_NAME");
          Metadata mt = new Metadata(conn);
          colName = mt.getColumnName(ntn, colName);
          cols.add(colName);
        }
        ib.addColumns((String[])cols.toArray(new String[cols.size()])).addToTable(t);
      }
    
      public void createForeignKey(String tableName, String referencedTable)
        throws IOException, SQLException
      {
        String ntn = escape4Hsqldb(tableName);
        String rntn = escape4Hsqldb(referencedTable);
        String tn = escape4Access(tableName);
        String rtn = escape4Access(referencedTable);
        createForeignKey(ntn, rntn, tn, rtn);
      }
    
      public void createForeignKeys(String tableName)
        throws IOException, SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        String ntn = escape4Hsqldb(tableName);
        String tn = escape4Access(tableName);
        ResultSet fkrs = conn.getHSQLDBConnection().getMetaData().getImportedKeys(null, null, ntn.toUpperCase());
    
        HashSet<String> hs = new HashSet();
        while (fkrs.next()) {
          hs.add(fkrs.getString("PKTABLE_NAME"));
        }
        Metadata mt = new Metadata(conn);
        for (String rntn : hs) {
          createForeignKey(ntn, rntn, tn, mt.getTableName(rntn));
        }
      }
    
      private void createForeignKey(String tn4Hsqldb, String refTn4Hsqldb, String tn4Access, String refTn4Access)
        throws IOException, SQLException
      {
        UcanaccessConnection conn = UcanaccessConnection.getCtxConnection();
        Database db = conn.getDbIO();
        Table t = db.getTable(tn4Access);
        Table rt = db.getTable(refTn4Access);
        RelationshipBuilder rb = new RelationshipBuilder(rt, t);
        rb.setReferentialIntegrity();
        ResultSet fkrs = conn.getHSQLDBConnection().getMetaData().getCrossReference(null, null, refTn4Hsqldb.toUpperCase(), null, null, tn4Hsqldb.toUpperCase());
    
        Metadata mt = new Metadata(conn);
        while (fkrs.next())
        {
          String colName = fkrs.getString("FKCOLUMN_NAME");
          colName = mt.getColumnName(tn4Hsqldb, colName);
          String rcolName = fkrs.getString("PKCOLUMN_NAME");
          rcolName = mt.getColumnName(refTn4Hsqldb, rcolName);
          rb.addColumns(rcolName, colName);
          short dr = fkrs.getShort("DELETE_RULE");
          short ur = fkrs.getShort("UPDATE_RULE");
          switch (dr)
          {
          case 0: 
            rb.setCascadeDeletes();
            break;
          case 2: 
            rb.setCascadeNullOnDelete();
          }
          if (ur == 0) {
            rb.setCascadeUpdates();
          }
        }
        rb.toRelationship(db);
      }
    }
    

    I didn't try to print parameters ,,,

     
  • Gord Thompson

    Gord Thompson - 2019-02-15

    So is your code trying to pass 3333 as one of the parameter values? If so, then check the field definition in the Access table to see why it might be rejected.

     
    ❤️
    1
  • Abdelrazek Nageh

    I am very grateful to you, you helped me a lot (Dev Gord Thompson) .... the code running correctly .
    as you said I Check my definition of my access table , I forget I defined one record of them as Byte(255 char) so I was i pass large number test , in the end I deleted all rows and I defined it again. it's perfect.... thank very very much

     
    🎉
    1

    Last edit: Abdelrazek Nageh 2019-02-15

Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.