# Problem beim Update in die Access DB



## tigerlily (4. Sep 2009)

Hallo an alle,

bin noch ein Java Neuling. Bis jetzt konnte ich mich gut durchbeißen 
Nun habe ich ein Problem. Ich möchte ein Update auf eine Access Tabelle ausführen.
Hier mal mein Java Code:


```
public int updateVertragBeginnAblaufPraemie(String beginn,String ablauf, String praemie, String VNr)
	{
		Statement st = null;
		int erg;
		
		try {
			st = connection.createStatement();
		} catch (SQLException e) {
			e.printStackTrace();
		}


		try {
			//In der Tabelle vertrag wird ein Update auf die Felder: beginn,ablauf und praemie durchgeführt
			//anhand der Vertragsnummer
			erg = st.executeUpdate("UPDATE vertrag set beginn='"+beginn+"',ablauf ='"+ablauf+"', praemie = '"+praemie+"' where vnr_norm = '"+VNr+"'");

			return erg;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return 0;
		}

	}
```

Im Feld Beginn und Ablauf steht sowas wie "20101983" drin.

Sobald ich das Update ausführen will bekomme ich folgende Meldung in Eclipse:

java.sql.SQLException: [Microsoft][ODBC Visual FoxPro Driver]Data type mismatch.
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
	at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
	at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3110)
	at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
	at sun.jdbc.odbc.JdbcOdbcStatement.executeUpdate(JdbcOdbcStatement.java:288)
usw. 

Wenn ich das Update Statement mit den Werten die die Funktion erhält direkt in die Access Datenbank schmeiße funktioniert es ohne Probleme. Wieso geht es aus Java nicht? Das Feld Beginn und Ablauf sind Datum/Uhrzeit Felder. Habe die Vermutung das dies nicht als String durchgeht. Wäre dankbar wenn mir einer einen Denkanstoß geben kann.:toll:

lg

dany


----------



## velaluka (4. Sep 2009)

Hallo,
sehr wahrscheinlich wird dein Datum String nicht so aufgebaut sein, wie Access es gerne hätte :noe:
Lösung wäre:
SimpleDateFormat um ein Datum passend zu formatieren. Ist allerdings nicht die tollste Lösung...
besser wäre ein PreparedStatement zu verwenden. Dort könntest du deinem update Statement gleich die passenden(Java) Typen geben.
Ein BSP.  Ist zwar kein Update funktioniert aber genauso....
Hoffe es hilft
Ciao velaluka


----------



## mg_666 (4. Sep 2009)

Liegt aber nicht an dem Datentyp der Where Klausel?


----------



## tigerlily (4. Sep 2009)

@mg_666: Die Where Klausel ist in Ordnung liegt einfach denke ich mal daran das in der DB beginn und ablauf Feld ein Datum/Uhrzeit ist und ich einen String übergebe. 

Wie gesagt wenn ich ich das Statement was ich mir in Java baue direkt in Access werfe, updatet Access den Datensatz. Rufe ich das Statement aus meiner Java Applikation heraus auf, dann knallt es mir um die Ohren. Data type mismatched 

Werde mal die Prepared Statements ausprobieren.

lg

dany


----------



## velaluka (4. Sep 2009)

Hallo tigerlily,


> Wie gesagt wenn ich ich das Statement was ich mir in Java baue direkt in Access werfe, updatet Access den Datensatz.


 Bist du dir sicher das es genau gleich ist? Hast du dir dein Java Update mal auf der Konsole ausgeben lassen? Prinzipiel sollte es auch mit "Strings" funktionieren, am Ende sollte die DB:lol:, also Access die Strings in die richtigen Typen wandeln, ist ja nicht anders als mit dem Frontend von A.
Aber besser ist Prepared Statements, gerade wenns mal ne update mehr werden soll
Ciao velaluka


----------



## tigerlily (4. Sep 2009)

@velaluka: Access will mal eine DB werden  

Also ich habe jetzt folgendermaßen mein Update umgebaut:


```
public int updateVertragBeginnAblaufPraemie(String beginn,String ablauf, String praemie, String VNr)
	{
			
		    PreparedStatement pstmt = null;
		    
		    try {
		      String query = "UPDATE vertrag SET beginn = ?,ablauf = ?,praemie= ? where vnr_norm = ?";
		      pstmt = connection.prepareStatement(query); // create a statement
		      pstmt.setString(1,beginn); // set input parameter 1
		      pstmt.setString(2, ablauf); // set input parameter 2
		      pstmt.setString(3, praemie); // set input parameter 2
		      pstmt.setString(4, VNr); // set input parameter 2
		      pstmt.executeUpdate(); // execute update statement
		      
		      return 1;
		      
		    }catch (Exception e) 
		    {
		       e.printStackTrace();
		    } finally 
		    {
		        try {
					pstmt.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		      
		    }
			return 0;
```

Soweit so gut, irgendwie ändert es aber nichts an der Tatsache das es immer noch nicht geht.

Hier mal der Code den ich direkt in Access absetze:


```
UPDATE vertrag set beginn="20101983" ,ablauf = "01062009", praemie ="000000006240"  where vnr_norm ="2200363526"
```

Das geht. hmm, irgendwie denk Probleme heute, ist ja schon Freitag 

lg

dany


----------



## velaluka (4. Sep 2009)

Juhu tigerlily,


> @velaluka: Access will mal eine DB werden


 ja wielange sollen wir den noch warten. Geht zwar schwer von den Lippen aber MSSql ist doch auch brauchbar...........

Schön das du ein PrepareSt. nimmst, jetzt solltes du nur noch die passenden Datentypen setzen und nicht wieder String 


```
public int updateVertragBeginnAblaufPraemie(String beginn,String ablauf, String praemie, String VNr)
    {
            
            PreparedStatement pstmt = null;
            
            try {
              String query = "UPDATE vertrag SET beginn = ?,ablauf = ?,praemie= ? where vnr_norm = ?";
              pstmt = connection.prepareStatement(query); // create a statement
              pstmt.setDate(1,beginn); // Date oder Timestamp
              pstmt.setTimestamp(2, ablauf); // kann ich leider so nicht sagen
              pstmt.setLong(3, praemie); // set input parameter 2
              pstmt.setString(4, VNr); // set input parameter 2
              pstmt.executeUpdate(); // execute update statement
              
              return 1;
              
            }catch (Exception e) 
            {
               e.printStackTrace();
            } finally 
            {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
              
            }
            return 0;
```
 Man achte auf die Setter vom PreparedStatement...
Ciao velaluka

Nachtrag: Eventuell jetzt schon die entsprechenden typen der Methode übergeben...


----------



## tigerlily (4. Sep 2009)

Hallo,

irgendwie bin ich zu blöde für das Datumsformat. Ich habe gelesen dass das
Datumsformat in Access folgendermaßen aussehen muss

Datumswerte werden in MS Access mit '#' dem Gartenzaunzeichen begrenzt.
-> #01/10/2001# -> 01.10.2001

wie bekomme ich jetzt meinen String in solch ein Format????:L


----------



## velaluka (4. Sep 2009)

Hallo tigerlily,
wie kommen den die Strings zur Methode. Wird irgendwo ein Date zu einen String, oder sind das Werte die nur als Strings vorhanden?
Falls du ein Date hast, kannst du es so wandeln
	
	
	
	





```
Date dat = new Date();
	    	  SimpleDateFormat sdf = new SimpleDateFormat("#dd/MM/yyyy#");
	    	  System.out.println(sdf.format(dat));
```
, wenn du einen String behälts kannst du mit CDate den String in ein Date wandeln.
Ciao velaluka


----------



## tigerlily (4. Sep 2009)

Hallo,

die Strings die ich übergebe sind Strings aus einer Txt Datei die ich entsprechend mit substring herausschneide. Diese Strings enthalten so was wie:

20101983  soll dann in tabelle als ->  20.10.1983 eingefügt werden.

danke schonmal für die Antwort. Werde das mal ausprobieren.

lg

dany


----------

