ist hieran was falsch ? UPDATE Anweisung

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hi all,

in die neu angelegte Spalte werden einfach keine Werte geschrieben.
Sie ist in Acces einfach leer 🙁
Es kommt aber auch keine Fehlermeldung 🙁

Fällt jemandem was auf ?

Code:
try {
			stmt.executeUpdate("ALTER TABLE Mannschaft add AnzAufstellungen INTEGER"); 
			 stmt.executeUpdate("UPDATE Mannschaft SET AnzAufstellungen=10"); // geht ned !!
		}
		catch (SQLException sqe) {System.err.println(sqe); }]

und noch 2 Kleinigkeiten in dem Befehl die stören :

- statt INTEGER NUMBER(4) geht nicht 🙁
- als Spaltenname 'Anz Aufstellungen' geht (ohne Hichkommas gehts ned), aber in der Acces DB Ansicht heisst die Spalte dann " 'Anz Aufstellungen' " also mit Hochkommas 🙁

danke im Voraus
 
Anonymous hat gesagt.:
[..] in die neu angelegte Spalte werden einfach keine Werte geschrieben.
Sie ist in Acces einfach leer 🙁
Es kommt aber auch keine Fehlermeldung 🙁

Fällt jemandem was auf ?

Code:
try {
			stmt.executeUpdate("ALTER TABLE Mannschaft add AnzAufstellungen INTEGER"); 
			 stmt.executeUpdate("UPDATE Mannschaft SET AnzAufstellungen=10"); // geht ned !!
		}
		catch (SQLException sqe) {System.err.println(sqe); }]

und noch 2 Kleinigkeiten in dem Befehl die stören :

- statt INTEGER NUMBER(4) geht nicht 🙁
- als Spaltenname 'Anz Aufstellungen' geht (ohne Hichkommas gehts ned), aber in der Acces DB Ansicht heisst die Spalte dann " 'Anz Aufstellungen' " also mit Hochkommas 🙁

danke im Voraus

Wegen der fehlenden Werte versuche einmal, die Statements separat abzusetzen, d.h. zuerst das ALTER-Statement in einem separatem TRY..CATCH-Block.
Zudem probier einmal, ob ein INSERT-Statement für die hinzugefügte Spalte funktioniert.

Außerdem brauchst du ein ALTER-Statement in einem solchen Fall ohnehin nur einmal abzusetzen.
Probier auch einmal ein zusätzliches COMMIT aus. Kann sein, dass deine Access-DB nicht im Auto-Commit-Modus ist.

Wg. NUMBER(4) schau einfach einmal in Access-Doku.

Das mit den Hochkommata ist so in Ordnung, ansonsten könnte die Access-DB das Leerzeichen im Tabellennamen nicht richtig interpretieren.

Hth
 
ops hatte mich gar ned eingeloggt ...


ja das mit 2 Try catch Blocks hatte ich schon probiert, kein Unterschied.

INSERT wollte ich testen:
Code:
stmt.executeUpdate ("INSERT INTO Mannschaft VALUES (100,'Mustermann','Max','19751025',13);");
aber es kommt der Fehler
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Datentypen in Kriterienausdruck unverträglich.
hmmm INTEGER muessen ja ned in Hochkommas sein, liegts am Datum ?
Die Tabelle is weiter oben so definiert:
Code:
stmt.execute ("CREATE TABLE Mannschaft (Nr INTEGER PRIMARY KEY, Name VARCHAR (50), Vorname VARCHAR (50), Geburtsdatum DATE)");
+ halt unten dann noch eine Spalte Integer dran ....

Wie meinst du das mit COMMIT , koenntes du ein Bsp. schreiben bzw. wie man es eben benutzt (kenne mich mit sql kaum aus) , dann koennt ich das auch noch testen ...


----------------------
was ich noch selbst (erfolglos), auf einen Tipp von jemand anderem getestet hab:

Na, wenn du Access eh installiert hast, mach doch mal folgendes:

Datenbank in Access öffnen.
Menüpunkt: Abfragen
Neue Abfrage

Und dann klickst du dir deine Abfrage zusammen.
Rechtsklick ins obere Feld, Tabelle hinzufügen, Mannschaft wählen.
Rechtsklick ins untere Feld, Abfragetyp wählen -> Aktualisierungsabfrage

AnzAufstellung von dem Fensterchen oben nach unten in die Tabelle ziehen.
Bei Aktualsierung (Update?) eintragen: 10

und dann oben links auf SQL-Ansicht.
Da steht dann wie Access es für sich selbst zusammenbauen würde, und dann weißt du ob dein Syntax stimmt.


Raus kam dann (zitiere mich mal selbst 😉 ) :
Access schustert sich das hier zusammen :
UPDATE Mannschaft SET Mannschaft.AnzAufstellungen = 10;

hab das nun mit
stmt.executeUpdate("UPDATE Mannschaft SET Mannschaft.AnzAufstellungen = 10;");

benutzt, leider ohne Erfolg. (Keine Fehlermeldung .. nix)

Wenn ich die In Access erstellte Abfrage ausführe, werden die Inhalte übrigens geschrieben ...
 
Ich hab dein Beispiel mal nachgebaut (MS-Access 2000 [9.0.x]), bin aber leider auch nicht weiter gekommen. Bei mir gibt es bei der ALTER-Anweisung folgende Fehlermeldung:

Code:
Microsoft][ODBC Microsoft Access Driver] Der Entwurf von 'Mannschaft' kann nicht bearbeitet werden. Er befindet sich in einer schreibgeschützten Datenbank.

Die Tabelle habe ich "Mannschaft" genannt. Ich habe schon einiges ausprobiert (Konfiguration auf alle möglichen Parameter gesetzt etc.), bin aber nicht wirklich weiter gekommen. Wie bei dir hat die Anweisung innerhalb Access funktioniert.

Vielleicht weiß jemand anders Rat?
 
So, jetzt habe ich den Fehler gefunden (seinen eigenen Code müsste man lesen können...).

Bei mir funktioniert der folgende Code einwandfrei (siehe auch Kommentare), vielleicht hilft er dir ja weiter:

Code:
package msaccess;

import java.sql.*;
import java.text.*;

public class Mannschaft {
	//
	public static void print(double value, String format) {
		DecimalFormat df = new DecimalFormat(format);
		System.out.println(df.format(value));
	}

	public static void main(String[] args) {
		double gehalt;
		String name, vorname;
		Date date;
		int id, ii;
		// 
		try {
			System.out.println("* Treiber laden");
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			System.out.println("* Datenbank-Verbindung beginnen");
			Connection con = DriverManager.getConnection("jdbc:odbc:SPORT");
			//con.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
			System.out.println("* Statements beginnen");
			Statement stmt = con.createStatement();
			System.out.println("* 1. SQL-Statement beginnen");
			ResultSet rs = stmt.executeQuery("SELECT * FROM Mannschaft");
			ii = 0;
			while (rs.next()) {
				id = rs.getInt(1);
				name = rs.getString(2);
				vorname = rs.getString(3);
				date = rs.getDate(4);
				System.out.println("-> "+id+": "+name+", "+vorname+", "+date);
				ii++;
			}
			System.out.println("* 1. SQL-Statement beenden");
			System.out.println("* Anzahl Datensätze ermitteln und ausgeben");
			System.out.println("Insgesamt wurden " + ii
					+ " Datensaetze gelesen.");
			System.out.println("* 2. SQL-Statement beginnen - ALTER TABLE / UPDATE ...");
			// Für UPDATE -> executeUpdate().
			stmt.executeUpdate("ALTER TABLE Mannschaft add AnzAufstellungen INTEGER"); // geht beim ersten 
                       //Mal einwandfrei, ansonsten Fehler
			
	        stmt.executeUpdate("UPDATE Mannschaft SET AnzAufstellungen=10"); // geht !
	        System.out.println("* 2. SQL-Statement beenden");
			
	        stmt.close();
			System.out.println("* Datenbank-Verbindung beenden");
			con.close();
		} catch (Exception e) {
			System.err.println("*** Fehler: " + e);
		}
	}
}
 
oh danke für deine Mühe ich hab deins getestet und Ja da sklappt bei mir auch !

ich konnte aber nicht erkennen warum deins funzt :/ ...

EDIT: oooooooooooooooooh doch ... es lag daran dass ich ned geclosed hab ?!

hmmmmmmmmmmmmmmmmmmm

stmt.close();
con.close();

hatte ich ned drinnen
 
pro_evo hat gesagt.:
[..]
EDIT: oooooooooooooooooh doch ... es lag daran dass ich ned geclosed hab ?!
hmmmmmmmmmmmmmmmmmmm
stmt.close();
con.close();

hatte ich ned drinnen

Ja, das kann der Grund gewesen sein, weil in diesem Fall die Transaktion nicht durchgeschrieben wird. Beim SELECT liegt es auf der Hand, weil das keine eigentliche Transaktion ist.

@Mods: Bitte bei Gelegenheit Haken setzen.
 
Anonymous hat gesagt.:
Ja, das kann der Grund gewesen sein, weil in diesem Fall die Transaktion nicht durchgeschrieben wird. Beim SELECT liegt es auf der Hand, weil das keine eigentliche Transaktion ist.

@Mods: Bitte bei Gelegenheit Haken setzen.

Hoppla, war eben nicht eingeloggt.
 
kaum ein Problem gelöst schon das naechste da ...

is immernoch die gleiche Klasse ... aber hier ist anscheined irgendwas falsch :

Code:
ResultSet my_rs = stmt.executeQuery("SELECT AnzAufstellungen FROM Mannschaft") ;
		
			while (my_rs.next()){
				int zufall = (int)(Math.random()*35);
				//System.out.println(my_rs.getInt("AnzAufstellungen"));
				System.out.println(zufall);
				my_rs.updateInt("AnzAufstellungen", zufall);	 // geht ned !!
				//my_rs.updateRow();
			}

so wie ichs ausführ kommt :

java.lang.NullPointerException
at sun.jdbc.odbc.JdbcOdbcBoundCol.setRowValues(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.updateInt(Unknown Source)
at sun.jdbc.odbc.JdbcOdbcResultSet.updateInt(Unknown Source)
at blatt04.main(blatt04.java:142)
Exception in thread "main"


irgendwas stimmt bei der updateInt ned ... hab aber k A was .... :?: ohne sie funzt es, er gibt z.B: 20mal nen Zufallszahl aus, also ein ResultSet is da ....
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben