Hallo!
Ich habe zwei kleine Klassen geschrieben, die eine beliebige Tabelle (egal, welches DBMS dahintersteckt) in einer JTable anzeigt. Außerdem kann man neue Datensätze einfügen, löschen und Datensätze verändern.
Ich habe bisjetzt nur auf MySQL gearbeitet und natürlich sollte es keinen Unterschied machen, ob ich jetzt auf MySQL oder Oracle arbeite, immerhin sind ja die Queries identisch.
Allerdigs geht bei Oracle nur das auslesen - will ich ein Update, Delete oder Insert machen dann hängt sich das Programm auf.
Die wesentlichen Stellen:
Verbindungsaufbau - funktioniert
[B][size=10][COLOR=#7f0055][align=left]private void createConnection(String driver, String user, String password){
try{
//Parameter
String url="jdbc:odbc:" + driver;
//Verbindungsaufbau
connection=DriverManager.getConnection(url, user, password);
//Statement Object erzeugen
statement = connection.createStatement();
}
catch(SQLException e){
e.printStackTrace();
System.out.println(e.getErrorCode());
add(new JTextField(e.toString()));
}
}[/B][/COLOR][/SIZE][size=10][/align]
[/SIZE]
Alles anzeigen
Tabelle auslesen - funktioniert
private void refreshTable(){
String[] columnNames;
String[][] data;
try{
ResultSet rs = statement.executeQuery("SELECT count(*) FROM " + table);
rs.next();
int num = rs.getInt(1);
rs = statement.executeQuery("SELECT * FROM " + table);
ResultSetMetaData md = rs.getMetaData();
columnNames = new String[md.getColumnCount()];
for(int i = 1; i <= md.getColumnCount(); i ++) {
columnNames[i-1] = md.getColumnName(i);
}
data = new String[num][columnNames.length];
int j = 0;
while(rs.next()){
for(int i=1; i <= md.getColumnCount(); i++){
data[j][i-1] = rs.getString(i);
}
j++;
}
DataModel m = new DataModel(columnNames, data);
m.addTableModelListener(new TableListener());
jTable.setModel(m);
}
catch(SQLException e){
e.printStackTrace();
add(new JTextField(e.toString()));
}
}
Alles anzeigen
Neue Datensätze einfügen - funktioniert
private class AddButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
StringBuilder build = new StringBuilder("INSERT INTO " + table + " VALUES(");
for(JTextField t : fields){
build.append("'" + t.getText() + "', ");
}
build.deleteCharAt(build.length()-1);
build.deleteCharAt(build.length()-1);
build.append(")");
try{
statement.execute(build.toString());
refreshTable();
}
catch(Exception e){
e.printStackTrace();
}
for(JTextField t : fields){
t.setText("");
}
}
}
Alles anzeigen
Update - funktioniert nicht, hängt sich bei statement.executeUpdate(query.toString()); auf.
private class TableListener implements TableModelListener{
@Override
public void tableChanged(TableModelEvent evt) {
DataModelEvent m = (DataModelEvent)evt;
int row = evt.getFirstRow();
StringBuilder query = new StringBuilder("UPDATE " + table + " SET");
int cols = jTable.getModel().getColumnCount()-1;
for(int i = 0; i < cols; i++){
query.append(" " + jTable.getModel().getColumnName(i) + "='");
query.append((String)jTable.getModel().getValueAt(row, i));
query.append("',");
}
query.deleteCharAt(query.length()-1);
query.append(" WHERE " + jTable.getModel().getColumnName(0) + "='" + m.getVal() + "'");
try{
statement.executeUpdate(query.toString());
System.out.println(query.toString());
}
catch(SQLException e){
e.printStackTrace();
refreshTable();
}
}
}
Alles anzeigen
Datensatz löschen - funktioniert nicht, hängt sich ebenfalls an der selben Stelle auf.
[B][size=10][COLOR=#7f0055][align=left]private class DeleteButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent arg0) {
DataModel m = (DataModel)jTable.getModel();
int rows = m.getRowCount();
for(int i = 0; i < rows; i++){
if(m.isRowSelected(i)){
String query = "DELETE FROM " + table + " WHERE " + m.getColumnName(0) + "='" + m.getValueAt(i, 0) + "'";
try{
statement.executeUpdate(query);
}
catch(SQLException e){
e.printStackTrace();
refreshTable();
}
}
}
refreshTable();
}
}[/B][/COLOR][/SIZE][size=10][/align]
[/SIZE]
Alles anzeigen
Also scheinbar liegt es an dem executeUpdate - aber wieso? Es müsste doch theoretisch auf jeder Datenbank funtionieren! Hat jemand eine Ahnung, was da genau der Fehler ist bzw. wie man dem ausweichen kann?
Lg.