[Java]Update einer Access-DB durch JTable

Von: , Frage gestellt am Mi, 7. Jun 2000

Hallo!

Ich möchte meine Datenbank (Access 2000, Zugriff über JDBC:ODBC)
updaten, sobald das im JTable angezeigte ResultSet verändert wird.
<CODE>
// Code ist angelehnt an ein Beispiel aus dem SUN Tutorial über JTables

public class DataTableModel extends AbstractTableModel
{
Vector data; //enthält alle Daten des JTables
Vector columnNames; //enthält alle Spaltenüberschriften
ResultSetMetaData rs;

public DataTableModel()
{
// Jetzt hole ich die Vektoren von der Klasse DBManager,
// die die DB-Connections übernimmt
data = DBManager.getDefaultDBManager().getData();
columnNames = DBManager.getDefaultDBManager().getColumnNames();

try
{
// Der ResultSet des DBManagers wird in ResultSetMetaData
umgewandelt,
// da setValueAt() einen solchen Typ benötigt
rs = DBManager.getDefaultDBManager().getResultSet().getMetaData();
}

catch (SQLException ex)
{
System.err.println(ex);
}

}

// Methode generiert das SQL-Statment
public String dbRepresentation(int column, Object value)
{
int type;

if (value == null)
{
return "null";
}

try
{
type = rs.getColumnType(column+1);
}

catch (SQLException e)
{
return value.toString();
}

switch(type)
{
case Types.INTEGER:
case Types.DOUBLE:
case Types.FLOAT:
return value.toString();
case Types.BIT:
return ((Boolean)value).booleanValue() ? "1" : "0";
case Types.DATE:
return value.toString(); // This will need some
conversion.
default:
return "'"+value.toString()+"'";
}
}


// Methode wird aufgerufen, sobald im JTable etwas geändert wird
public void setValueAt(Object value, int row, int column) {
try
{
String tableName = rs.getTableName(column+1);

if (tableName == null)
{
System.out.println("Table name returned null.");
}

String columnName = getColumnName(column);
String query =
"UPDATE "+tableName+
" SET "+columnName+" = "+dbRepresentation(column,
value)+
" WHERE ";

for(int col = 0; col<getColumnCount(); col++)
{
String colName = getColumnName(col);

if (colName.equals(""))
{
continue;
}

if (col != 0)
{
query = query + " and ";
}

query = query + colName +" = "+
dbRepresentation(col, getValueAt(row, col));
}

System.out.println(query);
DBManager.getDefaultDBManager().updateDB(query);
}

catch (SQLException e)
{
e.printStackTrace();
System.err.println("Update failed");
}

Vector dataRow = (Vector)data.elementAt(row);
dataRow.setElementAt(value, column);
}
}
</CODE>
Laut Ausführungsprotokoll wird auf jeden Fall ein richtiges
Update-Statement erzeugt:
UPDATE Personal SET Nachname = 'Bla' WHERE Nachname = 'Denzel' and
Vorname = 'Bernardin' and Fachgebiet = 'Datenbanken' and Gehalt = 100000

Das Update wird in meiner DB auch ausgeführt, jedoch erhalte ich immer
eine java.lang.ClassCastException. Wie kann ich das vermeiden?
<CODE>
Exception occurred during event dispatching:
java.lang.ClassCastException: java.lang.String
at DataTableModel.setValueAt(DataTableModel.java:187)
at javax.swing.JTable.setValueAt(JTable.java:1422)
at javax.swing.JTable.editingStopped(JTable.java:2557)
at
javax.swing.DefaultCellEditor.fireEditingStopped(DefaultCellEditor.java:281)
at
javax.swing.DefaultCellEditor$EditorDelegate.actionPerformed(DefaultCellEditor.java:382)
at javax.swing.JTextField.fireActionPerformed(JTextField.java:409)
at javax.swing.JTextField.postActionEvent(JTextField.java:443)
at
javax.swing.JTextField$NotifyAction.actionPerformed(JTextField.java:537)
at javax.swing.text.JTextComponent.mapEventToAction(Compiled Code)
at javax.swing.text.JTextComponent.processComponentKeyEvent(Compiled
Code)
at javax.swing.JComponent.processKeyEvent(Compiled Code)
at java.awt.Component.processEvent(Compiled Code)
at java.awt.Container.processEvent(Compiled Code)
at java.awt.Component.dispatchEventImpl(Compiled Code)
at java.awt.Container.dispatchEventImpl(Compiled Code)
at java.awt.Component.dispatchEvent(Compiled Code)
at java.awt.LightweightDispatcher.processKeyEvent(Compiled Code)
at java.awt.LightweightDispatcher.dispatchEvent(Compiled Code)
at java.awt.Container.dispatchEventImpl(Compiled Code)
at java.awt.Window.dispatchEventImpl(Compiled Code)
at java.awt.Component.dispatchEvent(Compiled Code)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:258)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:68)
</CODE>
Was mache ich falsch? Ich bin dankbar für jegliche Tips bezüglich des
Updates und wie ich über das JTable auf geeignete Weise auch noch
Inserts und Deletes ausführen kann.

Grüße, Tanja

0 Antworten zu dieser Frage

    Keine passende Antwort gefunden? Jetzt eigene Frage stellen!