仅在使用EmbeddedDriver时出现Derby数据库连接问题

时间:2015-01-06 08:26:58

标签: java mysql swing derby embedded-database

我正在尝试开发包含JTable和嵌入式数据库的程序。所以我将逻辑添加到表模型中(由于此错误,逻辑尚未完全构建为与jTable一起使用)。

在这里,我使用setup()方法开始连接。

private void setup(){
        try{
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            connection=DriverManager.getConnection("jdbc:derby:sheet;create=true","test","1234");
            statement=connection.createStatement();
        }

        catch(ClassNotFoundException cnf){
            System.out.println("class error");
        }

        catch(SQLException se){
            System.out.println(se);
        }
    }

最后,我清除所有数据并在程序开始时将它们设置为null。

private void clearDataBase(){
        for(int i=1;i<this.getColumnCount();i++){
            for(int j=1;j<this.getRowCount();j++){

                try{
                    prepStatement=connection.prepareStatement("UPDATE SHEETDATA SET "+getColumnName(i)+"=NULL WHERE INDEX IN (?)");
                    prepStatement.setInt(1, j);
                    prepStatement.executeUpdate();
                }
                catch(SQLException se){
                    System.out.println(se);  
                }
            }

        }
    }

以这种方式,它给了我一个错误,schema TEST deosn's exist。但是在我的数据库中,我有一个名为TEST的模式,而且,我已经包含了所有列。然后我使用了默认模式APP并将数据添加到它。(还将语句更改为"UPDATE SHEETDATA SET "+getColumnName(i)+"=NULL WHERE INDEX IN (?)")。但随后出现了Table/View 'APP.SHEETDATA' does not exist的错误。

我非常确定在向数据库添加数据时没有错误。此外,当我将驱动程序更改为ClientDriver并使用server-client aproach时,此代码可以正常工作。我在这里找不到错误,而且,我已经在互联网上搜索了一个解决方案。我发布这个是因为我找不到解决方案。在此先感谢!

这是我完整的TableModel类:

package myUserInterface;


import javax.swing.table.AbstractTableModel;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.PreparedStatement;


public class MyTableModel extends AbstractTableModel {

    private String[] columnNames;
    private Cell[][] cells;
    private String[][] data;
    private Connection connection;
    private Statement statement;
    private PreparedStatement prepStatement;

    MyTableModel(int row,int col){
        columnNames=setColumns(col);
        data=setRows(row,col);
        setCells(row,col);
        setup();
        clearDataBase();
    }

    @Override
    public int getColumnCount(){
        return columnNames.length;
    }

    @Override
    public int getRowCount(){
        return data.length;
    }

    @Override
    public Object getValueAt(int row,int col){
        return cells[row][col].getContent();
    }


    @Override
    public String getColumnName(int col){
        return columnNames[col];
    }


    @Override
    public Class getColumnClass(int col){
        return getValueAt(0,col).getClass();
    }


    @Override
    public boolean isCellEditable(int row,int col){
        return col!=0;
    }


    @Override
    public void setValueAt(Object content,int row,int col){
        data[row][col]=(String)content;
        cells[row][col].setContent((String)content);
        String query="UPDATE IMESHA.SHEETDATA SET "+this.getColumnName(col)+"="+"'"+(String)content+"'"+
                "WHERE INDEX IN ("+row+")";

        //updating the database accordingly to the changes made to the jTable.
        try{
            statement.executeUpdate(query);
        }
        catch(SQLException se){
           System.out.println(se);
        }

        fireTableCellUpdated(row,col);
    }


    public String getCellContent(int row,int col){
        return cells[row][col].getContent();
    }

    public String getCellTemp(int row,int col){
        return cells[row][col].getTemp();
    }

    //This method returns a string array, which will be used as the set of column names
    private String[] setColumns(int col){
        String[] columns=new String[col];
        columns[0]="Index";
        int x=66;
        while(x<92){
            columns[x-65]=Character.toString((char)(x-1));
            x++;
        }
        return columns;
    }

    //this method returns the 2 dimension array of cell objects
    private String[][] setRows(int row,int col){
        data=new String[row][col];
        int index=1;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(j==0){
                    data[i][j]=Integer.toString(index);
                    index++;
                    continue;
                }
                data[i][j]="";
            }            
        }
        return data;
    }

    private void setCells(int row,int col){
        cells=new Cell[row][col];
        int index=1;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(j==0){
                    cells[i][j]=new Cell(Integer.toString(index));
                    index++;
                    continue;
                }
                cells[i][j]=new Cell();
            }            
        }
    }

    /**
     * This method is to connect the database with the table
     */
    private void setup(){
        try{
            Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
            connection=DriverManager.getConnection("jdbc:derby:sheet;create=true","test","1234");
            statement=connection.createStatement();
        }

        catch(ClassNotFoundException cnf){
            System.out.println("class error");
        }

        catch(SQLException se){
            System.out.println(se);
        }
    }


    private void clearDataBase(){
        for(int i=1;i<this.getColumnCount();i++){
            for(int j=1;j<this.getRowCount();j++){

                try{
                    prepStatement=connection.prepareStatement("UPDATE APP.SHEETDATA SET "+getColumnName(i)+"=NULL WHERE INDEX IN (?)");
                    prepStatement.setInt(1, j);
                    prepStatement.executeUpdate();
                }
                catch(SQLException se){
                    System.out.println(se);  
                }
            }

        }
    }

}

1 个答案:

答案 0 :(得分:1)

您可能正在使用两个不同的数据库,这两个数据库都命名为&#34; sheet&#34;。

当您使用客户端/服务器驱动程序运行时,您将使用名为&#34; sheet&#34;的数据库。它存储在Derby Network Server的主目录中。

当您使用嵌入式驱动程序运行时,您正在使用名为&#34; sheet&#34;的数据库。在运行程序时,它存储在程序的当前工作目录中。

尝试在硬盘中搜索名为&#34; sheet&#34;的文件夹,然后查看您是否找不到两个不同的文件夹。

出于其他一些可能的原因,您的架构在连接到Derby时看起来并不像您期望的那样,请参阅此问题:Is it necessary to create tables each time you connect the derby database?