我正在尝试开发包含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);
}
}
}
}
}
答案 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?