Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ApacheDerbyID列应该一个接一个地自动递增-但它没有,为什么?_Java_Jdbc_Derby - Fatal编程技术网

Java ApacheDerbyID列应该一个接一个地自动递增-但它没有,为什么?

Java ApacheDerbyID列应该一个接一个地自动递增-但它没有,为什么?,java,jdbc,derby,Java,Jdbc,Derby,我试图创建一个ApacheDerby表,并通过JDBC接口在其中插入数据 以下是我的实现的简短摘录: public class SQLDatabase { private Connection connection = null; public final static String HOME_DIRECTORY = System.getProperty("user.home"); public final static String TABLE_NAME = "POR

我试图创建一个ApacheDerby表,并通过JDBC接口在其中插入数据

以下是我的实现的简短摘录:

public class SQLDatabase {

    private Connection connection = null;
    public final static String HOME_DIRECTORY = System.getProperty("user.home");
    public final static String TABLE_NAME = "PORPHYRIE";

    public SQLDatabase() {

        setConnection();
        if (!(isTableExisting(TABLE_NAME))) {

            createTable();
        }

    }




    // OTHER

    public void createTable() {
        String statement = "CREATE TABLE PORPHYRIE("
                + "ID int NOT NULL GENERATED ALWAYS AS IDENTITY"
                + "(START WITH 1,INCREMENT BY 1)," + "ENTRYDATE DATE NOT NULL,"
                + "DRUGTYPE varchar(255) NOT NULL,"
                + "UPPERLIMIT DOUBLE NOT NULL," + "NORMOSANG BOOLEAN NOT NULL,"
                + "MENSTRUATION BOOLEAN NOT NULL,"
                + "DRUGAMOUNT_MG DOUBLE NOT NULL,"
                + "DRUGAMOUNT_ML DOUBLE NOT NULL,"
                + "AMPOULE_NUMBERS DOUBLE NOT NULL,"
                + "RECORDDATE DATE NOT NULL," + "PRIMARY KEY(ID)" + ")";
        updateStatement(statement);
    }

    public void dropTable() {
        String statement = "DROP TABLE PORPHYRIE";
        updateStatement(statement);
    }

    public void addData(EntryPoint entry) {
        DrugAmount drugAmount = entry.getDrugAmountObject();
        SimpleDateFormat form = new SimpleDateFormat("dd.MM.yyyy");
        String statement = "INSERT INTO PORPHYRIE (ENTRYDATE,DRUGTYPE,UPPERLIMIT,NORMOSANG,MENSTRUATION,DRUGAMOUNT_MG,DRUGAMOUNT_ML,AMPOULE_NUMBERS,RECORDDATE)"
                + " values('"
                + form.format(entry.getEntryDate().getTime())
                + "','"
                + entry.DRUG_TYPE_DOLANTIN
                + "',"
                + entry.DRUG_UPPER_LIMIT
                + ","
                + entry.getNormoSang()
                + ","
                + entry.getMenstruation()
                + ","
                + drugAmount.getAmpoulesInMG()
                + ","
                + drugAmount.getAmpoulesInML()
                + ","
                + drugAmount.getNumberOfAmpoules() + ",CURRENT_DATE)";
        System.out.println("Add data!");
        updateStatement(statement);
    }


   private void setConnection() {
        try {
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            connection = DriverManager.getConnection("jdbc:derby:"
                    + HOME_DIRECTORY + "\\MyDB;create=true");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
    }
    private void updateStatement(String statementString) {
        try {
            PreparedStatement preparedStatement = getConnection()
                    .prepareStatement(statementString);
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
这就是我得到的:

ID列有什么问题

第一次创建SQL数据库对象时,应该创建表,这很好。 然后,您应该能够通过addData()方法插入一些数据,这看起来也不错。
但是,如果您创建一个新的SQL数据库对象并在中使用addData-method(),那么它会添加数据(上图中的第五行),但不会正确地自动递增。这里怎么了

生成的序列号中的间隔是Derby的正确且有文档记录的行为

比如说,


而且:

正如Bryan所描述的,这个错误是众所周知的。但好的是,您可以使用以下方法解决此问题:

DriverManager.getConnection(“jdbc:derby:;shutdown=true”)

这将关闭derby中的所有数据库,您可以始终指定要关闭的数据库


DriverManager.getConnection(“jdbc:derby:+HOME\u DIRECTORY+”\\MyDB;shutdown=true”)

问题是,无论何时注销或关闭应用程序,我们都必须关闭derby db,然后只正确插入值,否则缓存值会阻止在数据库表中准确插入值

请遵循以下步骤:

con=DriverManager.getConnection(“jdbc:derby:+“db”+“create=true”);->这是为了通过提及“db”名称来加载derby db。我们必须将此代码放入您的应用程序登录操作中

getConnection(“jdbc:derby:+“db”+“shutdown=true”);->这是用于关闭数据库“db”。我们必须将此代码放在您的应用程序注销操作或关闭位置

注意:这是针对嵌入式数据库的