CashedRowSet update - oder was mache ich falsch -

Status
Nicht offen für weitere Antworten.

Seve

Mitglied
Hallo zusammen,

ich habe eine Frage, bzw ein im Moment schweriegendes Problem...

ich habe eine Array von CachedRowSets, die meine Datenbank wiederspiegeln.
Wenn ich jetzt eines updaten will, also eine Zeile in der lokalen kopie ändern möchte verwende ich da zu folgenden Schnipsel:

Code:
public static void update (int index, String [] zeile, int nr)
{
	/*
	 * Updatet die bezeichnete Zeile aus der Kopie der Tabelle 
	 */
	try
	{
		CRS [index].absolute(nr);
		for (int x = 0; x < zeile.length; x ++)
		{
			CRS [index].setString(x+1, zeile[x]);
		}
		CRS [index].updateRow();
		System.out.println (CRS [index].rowUpdated());
	}
	catch (SQLException e)
	{
		e.printStackTrace();
	}
	catch (ArrayIndexOutOfBoundsException e)
	{
		throw new IllegalArgumentException ("Der Tabellenindex ist unbekannt"«»);
	}
}

wobei zeile [] immer den komplettem Inhalt der Zeile enthält die geändert werden soll.

Das ergebnis ist: 1. es wird "false" ausgeben...
2. beim zurück schreiben in die Datenbank kommt folgender Stack:
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3288)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3272)
at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4108)
at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3527)
at com.sun.rowset.internal.CachedRowSetReader.decodeParams(Unknown Source)
at com.sun.rowset.internal.CachedRowSetReader.readData(Unknown Source)
at com.sun.rowset.CachedRowSetImpl.execute(Unknown Source)
at com.sun.rowset.internal.CachedRowSetWriter.commit(Unknown Source)
at com.sun.rowset.CachedRowSetImpl.acceptChanges(Unknown Source)
at com.sun.rowset.CachedRowSetImpl.acceptChanges(Unknown Source)
at dbaccess.DBAccess2.speichern(DBAccess2.java:132)
at dbaccess.DBAccess2.speichern(DBAccess2.java:106)
at dbaccess.tester.<init>(tester.java:17)
at gui.Main.main(Main.java:92)
javax.sql.rowset.spi.SyncProviderException: Parameter index out of range (1 > number of parameters, which is 0).
at com.sun.rowset.CachedRowSetImpl.acceptChanges(Unknown Source)
at com.sun.rowset.CachedRowSetImpl.acceptChanges(Unknown Source)
at dbaccess.DBAccess2.speichern(DBAccess2.java:132)
at dbaccess.DBAccess2.speichern(DBAccess2.java:106)
at dbaccess.tester.<init>(tester.java:17)
at gui.Main.main(Main.java:92)

Und hier noch die Mehtode in der die Exceptions auftauchen:
Code:
private static void speichern (int x)
{
	try
       {
		CRS [x].acceptChanges(gui.Main.conn);
	}
	catch (SQLException e)
	{
		e.printStackTrace();
	}
}

Ich hoffe, ich habe alles verständlich dargelegt und es gibt jemand der mir helfen kann.

Gruß Seve
 
S

SlaterB

Gast
muss man nicht wissen, was CRS ist?
wird das mit irgendeiner SQL-Abfrage gebildet?
was läßt dich davon ausgehen, dass es einen Parameter 1 gibt?
 

Seve

Mitglied
okay,

Code:
private static CachedRowSetImpl[] CRS  = null;

ist die Ursprüngliche Deklaration.

gefüllt wird das Array mittels der folgenden Methode und die wird auch definitiv aufgerufen:

Code:
public static void ladealle ()
	{
		try
		{
			ResultSet rs = gui.Main.conn.createStatement().executeQuery("show tables from lehrerverteilung");
			rs.last();
			int x = rs.getRow();
			rs.beforeFirst();
			namen = new String [x/2];
			int n = 0;
			while (rs.next())
			{
				String temp = rs.getString(1);
				if (!temp.contains("arbeit"))
				{
					namen[n] = temp;
					n++;
				}
			}
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		CRS = new CachedRowSetImpl [namen.length];
		for (int x = 0; x < namen.length; x++)
		{
			CRS [x] = lade (namen [x]);
		}
	}
	
	private static CachedRowSetImpl lade(String tabelle)
	{
		String query = "SELECT * FROM " + tabelle;
		try
		{
			CachedRowSetImpl temp = new CachedRowSetImpl ();
			temp.setCommand(query);
			temp.execute(gui.Main.conn);
			temp.setConcurrency(ResultSet.CONCUR_UPDATABLE );
			return temp;
		}
		catch (SQLException e)
		{
			e.printStackTrace();
		}
		return null;
	}

Zum Parameter:
Nun ja, ich wüsste ehrlich gesagt nicht, wie ich sonst die Spalte definieren sollte, von der der Wert geändert werden soll.

Gruß Seve
 
S

SlaterB

Gast
na gut, nach der API
http://java.sun.com/j2se/1.5.0/docs/api/javax/sql/rowset/CachedRowSet.html
scheinst du das ja richtig zu machen ;)

vielleicht hast du eine Tabelle dabei, die keine Spalten enthält?
du musst ja nicht gleich alle Tabellen der Datenbank auf einmal bearbeiten (show tables from),
such dir doch erstmal eine aus, gib die Spalten aus und versuche dort die Daten zu ändern und zurückzuspeichern,

wenn es mit einer Test-Tabelle geht, dann ausweiten,
und loggen, z.B. welche Tabellen es alles gibt mit wieviel Spalten welcher Datentypen usw.
 
G

Guest

Gast
Also ich habe noch was rum probiert. Ich habe es erstmal, wie du vorgeschlagen hast nur mit einer Tabelle genommen, von der ich weiß, dass sie gefüllt ist, knapp 30 Datensätze. Also habe ich über die Metadaten mir anzeigen lassen, was Java von der Tabelle hält.

Code:
System.out.println (tabelle);
System.out.println (metaData.getColumnCount());
for (int x = 1; x < metaData.getColumnCount()+1; x++)
{
	System.out.println (metaData.getColumnName(x));
	System.out.println (metaData.getColumnTypeName(x));				
}

dabei kommt raus:
klasse
3
index
INT
stufe
INT
ordnung
VARCHAR

Wenn ich in der Updatemethode so erweitere:

Code:
public static void update (int index, String [] zeile, int nr)
{
	/*
	 * Updatet die bezeichnete Zeile aus der Kopie der Tabelle 
	 */
	try
	{
		System.out.println ("update");
		CRS [index].absolute(nr);
		ResultSetMetaData metaData = CRS [index].getMetaData();
		for (int x = 0; x < zeile.length; x ++)
		{
			System.out.println (x+1);
			System.out.println (metaData.getColumnName(x+1));
			System.out.println (metaData.getColumnTypeName(x+1));
			System.out.println (zeile [x]);
			CRS [index].setString(x+1, zeile[x]);
		}
		CRS [index].updateRow();
		System.out.println (CRS [index].rowUpdated());
		
	}
	catch (SQLException e)
	{
		e.printStackTrace();
	}
	catch (ArrayIndexOutOfBoundsException e)
	{
		throw new IllegalArgumentException ("Der Tabellenindex ist unbekannt");
	}
}

kommt folgendes raus:
update
1
index
INT
5
2
stufe
INT
6
3
ordnung
VARCHAR
x

also kann es eigendlich nicht an der falschen Zeilenanzahl liegen. Es sei denn ich liege völlig daneben.


Ich habe es grade mal mit einer Tabelle nur mit Varchars versucht. da kommt dann keine Exception mehr, aber er updatet immer noch nicht, hier nochmal der OutPrint:
statistik
2
name
VARCHAR
wert
VARCHAR
update
1
name
VARCHAR
hans
2
wert
VARCHAR
meyer
false

Ich hoffe, das jemand ne Idee hat.
 

Seve

Mitglied
:autsch: :autsch:

ich habe den Fehler dann doch mittlerweile gefunden. :oops: :oops:

Code:
CRS [index].setString(x+1, zeile[x]);

Setzt den Wert der Spalte wohin gegen:

Code:
CRS [index].updateString(x+1, zeile[x]);

Den Spalteninhalt updatet, was ich ja die ganze Zeit wollte.

Wenn das keine Betriebsblindheit ist. Aber jetzt funktiniersts, danke SlaterB für deine Hinweise

Gruß Seve (nicht das letzte Mal blind zu Euch kommend)
 
S

SlaterB

Gast
hmm, das habe ich auch übersehen,
aber ich hätte komplette Beispiele aus Tutorials kopiert ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T compiler fehler: should be mapped with insert="false" update="false" Datenbankprogrammierung 1
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
OnDemand Mysql UPDATE if condition Datenbankprogrammierung 14
OnDemand Select vs Update ins blaue, was ist teurer? Datenbankprogrammierung 11
OnDemand MySQL Trigger löst nicht aus bei Hibernate Update Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
F UPDATE - Befehl nur in einer Zeile Datenbankprogrammierung 11
L SQL-Statement INSERT INTO ON DUPLICATE KEY UPDATE funktioniert nicht Datenbankprogrammierung 5
M SQL-Statement SQL mit Java, Update Fehler Datenbankprogrammierung 1
OnDemand Update auf Mysql läuft nicht durch Datenbankprogrammierung 30
OnDemand SQL-Statement Update mit innerjoin Datenbankprogrammierung 18
OnDemand Update table SET will nicht Datenbankprogrammierung 9
P MySQL INSERT / UPDATE MySQL - perStoredProcedure oder direkt im Code Datenbankprogrammierung 3
S Update Tabelle aus Textfeld Datenbankprogrammierung 2
S JPA: update von Schlüsselwerten Datenbankprogrammierung 2
ruutaiokwu sql server werte swappen beim update-vorgang mit unique-constraints..? Datenbankprogrammierung 2
M Update Befehl Datenbankprogrammierung 1
S MySQL Nach wiederholtem Update falsche Werte (im Speicher?) Datenbankprogrammierung 1
M SQL-Statement Datentypen in Kriterienausdruck unverdräglich bei Update auf DB von Java aus Datenbankprogrammierung 0
M SQL UPDATE richtig anwenden BITTE um HILFE Datenbankprogrammierung 3
M SQL UPDATE führt zu JAVA Absturz Datenbankprogrammierung 6
S HSQLDB Verbieten eines update auf eine bestimmte reihe Datenbankprogrammierung 4
M Derby/JavaDB Neu geschriebener Eintrag per UPDATE lässt sich nicht unmittelbar abrufen Datenbankprogrammierung 2
S UPDATE user Datenbankprogrammierung 4
R Fehler 2601 trotz SQL-UPDATE ? Datenbankprogrammierung 2
B DB Update via batch Datenbankprogrammierung 3
H Update ganze zeile Datenbankprogrammierung 4
R sqlite UPDATE wirkt nicht aus Java Datenbankprogrammierung 7
S ID Wert von Insert über jdbcTemplate.update Datenbankprogrammierung 3
D Error 1452: Cannot add or update a child row: a foreign key constraint fails Datenbankprogrammierung 15
D SQL Update auf eine Query möglich? Datenbankprogrammierung 4
5 Datenbank Update Datenbankprogrammierung 8
A Oracle Update Befehl in Datenbank anhand einer Schleife Datenbankprogrammierung 8
turmaline Oracle "Häppchenweises" Update durchführen Datenbankprogrammierung 4
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
D ArrayIndexOutOfBoundsException bei Update von JTable und Model Datenbankprogrammierung 13
M Access Update Statement Fehler update -> unmöglich? Datenbankprogrammierung 3
J MyBatis - Update Problem Datenbankprogrammierung 4
S JPA: Problem mit Update von Daten Datenbankprogrammierung 7
I Derby/JavaDB Update Fehler Datenbankprogrammierung 4
N Update Prepared Statement Fehler bei Argumenten Datenbankprogrammierung 3
N batch-Update wird nicht durchgeführt Datenbankprogrammierung 2
R MS Access mit Java Problem mit Update Statment Datenbankprogrammierung 13
1 On duplicate Key update Datenbankprogrammierung 3
M DB update geht einfach nicht Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
G MySQL Update Datenbankprogrammierung 5
M MySQL größere von zwei Zahlen in Update Statement Datenbankprogrammierung 2
T Update an SQL Tabelle ?! Datenbankprogrammierung 10
C MySQL Update funktioniert nicht Datenbankprogrammierung 11
C Update Table1 mit Relationship Table2 Datenbankprogrammierung 6
prakdi einzelnen SQL Eintrag finden der "update" enthält Datenbankprogrammierung 3
V Datenbank Update Datenbankprogrammierung 7
A update methode für datenbank Datenbankprogrammierung 2
M Hibernate: Insert statt Update Datenbankprogrammierung 8
E Update DB; Werte aus Feldern übernehmen Datenbankprogrammierung 5
H Batch Update/Insert Datenbankprogrammierung 4
E Insert oder Update- Prüfung Datenbankprogrammierung 3
H Datenbank Update Datenbankprogrammierung 3
J SQL Abfrage: Verschiedene Werte in einer Spalte mit einem Update Befehl? Datenbankprogrammierung 7
cosmic Problem beim Update einer Oracle DB Datenbankprogrammierung 7
M Update mysql Fehler ?? Datenbankprogrammierung 4
T Problem beim Update in die Access DB Datenbankprogrammierung 9
R Update Time auslesen Datenbankprogrammierung 2
T DB2 delete/update über 2 Tabellen Datenbankprogrammierung 2
K Ist mein UPDATE fehlerhaft? Datenbankprogrammierung 3
G Update-Befehl Fehlerhaft ?? Datenbankprogrammierung 2
G Update Befehl funkt nicht. WARUM? Datenbankprogrammierung 5
S Update Problem Datenbankprogrammierung 3
M Insert Update usw. Datenbankprogrammierung 2
B [SQL] UPDATE oder REPLACE INTO Befehl Datenbankprogrammierung 10
S Update mit null Datenbankprogrammierung 11
H UPDATE . Datenbankprogrammierung 3
S PostgreSQL SELECT/UPDATE etc. Datenbankprogrammierung 4
T Update-Frage Datenbankprogrammierung 11
Y Hibernate - Update bestimmter Spalten Datenbankprogrammierung 2
G update sperren bei client/server anwendung Datenbankprogrammierung 7
T Diverse JDBC Probleme (inner join, rs.last(), update) Datenbankprogrammierung 2
B Update funktioniert nicht Datenbankprogrammierung 8
R Update und Insert Gleichzeitig? Datenbankprogrammierung 2
K MsAccess immer beim zweiten Update java.sql.SQLException Datenbankprogrammierung 28
N Hibernate & hsqldb: Problem bei db-update Datenbankprogrammierung 7
T Problem beim Update vom Resultset + Firebird Datenbankprogrammierung 2
G Update Statement automatisch unterteilen lassen Datenbankprogrammierung 3
G ist hieran was falsch ? UPDATE Anweisung Datenbankprogrammierung 8
W Hibernate Update Problem Datenbankprogrammierung 3
A Syntaxfehler bei update. Datenbankprogrammierung 8
O Update-Problem mit Hibernate-Framework Datenbankprogrammierung 5
L Problem mit Update Datenbankprogrammierung 14
L UPDATE löst Exception aus Datenbankprogrammierung 6
G Problem mit Datums-Format bei UPDATE Datenbankprogrammierung 3
F Update mit Prepared Statements Datenbankprogrammierung 10
T HSQLDB, wie mache ich das mit hsqldb.cache_scale? Datenbankprogrammierung 13

Ähnliche Java Themen

Neue Themen


Oben