# MS Access mit Java Problem mit Update Statment



## Rin (3. Mai 2011)

Hallo alle zusammen,

ich bin seit heute hier regestriert weil ich schon viele hilfreiche sachen hier gelesen habe und man merkt das hier einem geholfen wird

Ich hab folgendes Problem in folgendem Code:


```
String einmupStmt1 = "UPDATE Einmelder2 " +
				   "SET Einmelder2.Umfragelink = " + Umfragelink + " " +
				   "WHERE Umfragelink = Null AND EinmelderID IN (" +                                   Authentificator.getIdSb() +
				   ")";
				 PreparedStatement einmupPrepSt1 = con.prepareStatement(einmupStmt1);
				 boolean einmupresult1 = einmupPrepSt1.execute();
```

das Authentificator.getIdSb ist ein stringbuffer wo ausgewählte 20% einer tabelle upgedatet werden sollen so die Tabelle schaut so aus 


> Einmelder ID (Autowert)
> Einmelder (String)
> EinmelderEmail (String)
> LetzeUmfrage (Date) (Timestemp)
> ...



Problem ist das er mir jedes mal diesen fehler ausgibt:


> [Microsoft][ODBC-Treiber für Microsoft Access] 1 Parameter wurden erwartet, aber es wurden zu wenig Parameter übergeben.


 :bahnhof: ???:L

ich hoffe es kann mir wer helfen 
Vielen Dank

Lg


----------



## nrg (3. Mai 2011)

Mach doch mal nach Zeile 4 ein 
	
	
	
	





```
System.out.println(einmupStmt1);
```
 und führe dann diese Ausgabe direkt auf der Datenbank aus. So siehste dann schonmal recht schnell, ob du das Statement richtig zusammengesetzt hast. Ausserdem verstehe ich nicht, warum du PreparedStatement verwendest und dein Statement trotzdem selber zusammenbaust. PreparedStatement nimmt dir eigentlich diese Arbeit ab und macht die Statements dadruch transparenter und fehlerunanfälliger. 

btw: Variablen sind lowerCamelCase.


----------



## Rin (3. Mai 2011)

also wenn ich vorher System.out.println(einmupStmt1); zeigt er mir ein korrektes Statment

UPDATE Einmelder2 SET Einmelder2.Umfragelink = asdasdasd WHERE Umfragelink = Null AND EinmelderID IN (7269, 7270, 7271, 7272, 7273, 7274, 7275, 7276, 7277)

ich arbeit noch dazu mit swing und den link geb ich manuell ein

und wusst ich nicht das preparedstatment mir diese arbeit abnimmt dann sollte statment ausreichen wenn ich es eh zusammen bastel

was mich einfach so stutzig mach ist das die spalte vorhanden ist die where bedingung stimmt eigentlich auch hm...

sitzt jetzt schon seit gestern an diesem problem


----------



## areafo (3. Mai 2011)

Wo ist das ein korrektes Statement? Da fehlt doch hinten das ; evtl. Where noch klammern. Access ist da manchmal eigenen

UPDATE Einmelder2 SET Einmelder2.Umfragelink = asdasdasd WHERE (Umfragelink = Null AND EinmelderID IN (7269, 7270, 7271, 7272, 7273, 7274, 7275, 7276, 7277));


----------



## areafo (3. Mai 2011)

Einmelder2.Umfragelink = "asdasdasd" ist ja ein Text den du da überschreiben willst. Liegt also allein an deiner SQL Formulierung. zur Not Access auf u Aktualisierungsabfrage erstmal da formulieren.

mit \" escapen um " zu bekommen


----------



## Rin (3. Mai 2011)

ja das ; war nicht makiert und ist nicht kopiert worden :lol: xD und ja bin gerade selber darauf gekommen das es einfach nur banal ist und zwar die hochkomme fehlen danke trotzdem manchmal sieht man den wald für lauter bäumen nicht 

danke trotzdem an euch

lg


----------



## nrg (3. Mai 2011)

ja und genau bei solchen fehler könnte dir PreparedStatement helfen. also würde ich dir schon empfehlen dich damit anzufreunden.


----------



## Rin (3. Mai 2011)

ah wie genau kann mir das dabei helfen? kann ich sozusagen damit vorgefertigte statments nehmen und mit einzelnen parametern füttern sozusagen??


----------



## Rin (3. Mai 2011)

aja da fällt mir noch eine frage ein es gibt den Access befehl DLookup('Spalte','Tabelle') benutz ich um die umfrage id aus einer anderen tabelle zu lesen ohne das ich ein subselect brauche im Update Statment so jetzt ist die frage ob das nur den ersten Datensatz aussliest weil ich eben das problem hab das er mir die falsche ID in die Tabelle Hineinschreibt und ich nicht weiß wie ich das genauer mit einer where bedingung gestallten kann das er mir genau die ID zu der Dazugehörigen Umfrage ausliest und ein in die tabelle Einmelder einschreibt

sorry für dopple post


----------



## ARadauer (3. Mai 2011)

Rin hat gesagt.:


> ah wie genau kann mir das dabei helfen? kann ich sozusagen damit vorgefertigte statments nehmen und mit einzelnen parametern füttern sozusagen??


ja

(Was für eine Aussage für den 4.999 Post)


----------



## Rin (3. Mai 2011)

aber hilfreich danke  na dann werd ich mir das mal genauer anschauen


----------



## Rin (3. Mai 2011)

edit:

das problem ist leider doch nicht gelöst bzw hat sich ein neues Entwickelt also ich habe dieses Update Statement: 

```
UPDATE Einmelder2 SET UmfrageID = DLookup('UmfrageID','Umfrage2',"Umfragelink='test1'") WHERE LetzteUmfrage=Date() AND Gesperrt = 1;
```

so im Access funktionierts einbandfrei aber sobald ich ein statement im java mache funktionierts plötzlich nicht mehr -.- dann sagt er mir wieder das 1 Parameter erwartet wurde aber zu wenige gegeben waren

hoffe ich könnt mir helfen 

LG


----------



## r.w. (4. Mai 2011)

Hallo Rin,



Rin hat gesagt.:


> edit:
> 
> das problem ist leider doch nicht gelöst bzw hat sich ein neues Entwickelt also ich habe dieses Update Statement:
> 
> ...



kann es sein, dass Du vergessen hast, dort die doppelten Anführungszeichen zu maskieren?

BTW: 

```
String einmupStmt1 = "UPDATE Einmelder2 " +
                   "SET Einmelder2.Umfragelink = " + Umfragelink + " " +
                   "WHERE Umfragelink = Null AND EinmelderID IN (" +                                   Authentificator.getIdSb() +
                   ")";
                 PreparedStatement einmupPrepSt1 = con.prepareStatement(einmupStmt1);
                 boolean einmupresult1 = einmupPrepSt1.execute();
```
Was macht das für einen Sinn, PreparedStatements zu verwenden und dann 
das SQL-Statement doch selbst zusammen zu basteln statt Parameter zu verwenden?


VG ROlf


----------



## Rin (5. Mai 2011)

Hallo r.w.

also ja das erste problem waren die doppelten anführungs zeichen das hab ich shcon gemerkt und ja das mit preparedstatements hab ich jetzt auch geändert ich wusste nur nicht wie ich das benutzen sollte nur da ich mir denke das ich dieses update statment noch nicht mal zum laufen gebracht hab ohne das ich ein prepared statement draus mach würd ich gern raus finden wieso der nichts macht so

jetzt hab ich lang gegooglet gestern und raus gefunden das die ODBC Driver 1.2 - 1.4 das Dlookup mit 3 parametern nicht unterstützt darum funktioniert es im access aber im java über die ODBC Brücke nicht ...... jetzt hab ich mich daran gesetzt ein neues Update Statement zu schreiben das sieht wie folgt aus:

```
UPDATE Einmelder2 INNER JOIN Umfrage2 ON Einmelder2.UmfrageID=Umfrage2.UmfrageID SET Einmelder2.UmfrageID = Umfrage2.UmfrageID
WHERE Umfrage2.Umfragelink="asdasd" And Einmelder2.LetzteUmfrage=Date() And Einmelder2.Gesperrt=0;
```

so das funktioniert von der grundfunktion das er etwas updaten will aber immer 0 Zeilen obwohl ich die kriterien in meinen augen richtig definiert habe aber vielleicht sie ja ein andere von euch einen fehler die Tabellen schauen wie folgt aus:
Tabelle Einmelder2

EinmelderID (PK)
Einmelder
EinmelderEmail
LetzteUmfrage
UmfrageID (mit Beziehung zur Tabelle Umfrage2)
Gesperrt (boolean)

Tabelle Umfrage2

UmfrageID (PK)
Umfragelink


----------

