# ist hieran was falsch ? UPDATE Anweisung



## Guest (15. Mai 2005)

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 ?


```
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


----------



## abollm (15. Mai 2005)

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
> 
> ...



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


----------



## pro_evo (16. Mai 2005)

ops hatte mich gar ned eingeloggt ...


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

INSERT wollte ich testen:

```
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:

```
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
> ...




Raus kam dann (zitiere mich mal selbst  ) :


> Access schustert sich das hier zusammen :
> UPDATE Mannschaft SET Mannschaft.AnzAufstellungen = 10;
> 
> hab das nun mit
> ...


----------



## abollm (16. Mai 2005)

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:


```
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?


----------



## abollm (17. Mai 2005)

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:


```
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);
		}
	}
}
```


----------



## pro_evo (17. Mai 2005)

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


----------



## Guest (17. Mai 2005)

pro_evo hat gesagt.:
			
		

> [..]
> EDIT: oooooooooooooooooh doch ... es lag daran dass ich ned geclosed hab ?!
> hmmmmmmmmmmmmmmmmmmm
> stmt.close();
> ...



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.


----------



## abollm (17. Mai 2005)

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.


----------



## pro_evo (27. Mai 2005)

kaum ein Problem gelöst schon das naechste da ...

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


```
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 ....


----------

