# Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen?



## Maxder (20. Jan 2012)

Hallo,
ich schreibe gerade ein Java Programm mit Eclipse, in dem ich auf eine Datenbank zugreifen. Ich habe die Variable var als String definiert und sie bekommt vorher einen Wert zugewiesen. Nun will ich die Variable var in der SELECT Abfrage verwenden:
String sqlString="SELECT * FROM Tabelle1 WHERE Schluessel1=?";
PreparedStatement pstmt = dbVerbindung.prepareStatement(sqlString);
pstmt.setString(1, var);

Dann bekomme ich folgende Fehlermeldung:
[Microsoft][ODBC-Treiber für Microsoft Access]COUNT-Feld ungültig.

Wenn ich aber den aktuellen Wert von var manuell in die SELECT Abfrage eingebe funktioniert alles:
String sqlString="SELECT * FROM Tabelle1 WHERE Schluessel1='$%$'";

Das Problem ist nur, dass var sich je nach vorangehender Ereignisse ändert und vom Programm festgelegt wird, deshalb muss ich die Variable an sich in die SELECT Abfrage reinschreiben.

Weis jemand wie ich das machen kann?

mfg


----------



## Evil-Devil (20. Jan 2012)

Ist Schluessel1 ein Textfeld und soll der Wert verglichen oder ähnlich sein?

Wenn er identisch ist kannst du weiterhin mit = abfragen. Aber der Text muss natürlich in Hochkommata stehen. Wenn er ähnlich sein soll greifst du zu LIKE. DeiN % sollte an sich so gar nicht klappen.

[sql]select feld1, feld2, feld3 from tabelle1 where schluessel1 = 'hallo java welt'[/sql]

[sql]select feld1, feld2, feld3 from tabelle1 where schluessel1 like '%java%'[/sql]

Und Feldnamen sollten sofern es nicht zu vermeiden geht niemals nach einem Schlüsselwort benannt sein. Ebenso Tabellen- und Spaltennamen klein schreiben. Spätestens unter Linux kann das zu Problemen führen.


----------



## Camino (20. Jan 2012)

Vielleicht ist Schluessel1 kein String sondern einen Zahl (Integer)? Dann musst du natürlich beim PreparedStatement einen Integerwert und keinen String übergeben.


----------



## Maxder (20. Jan 2012)

In der String Variable var ist ein Text gespeichert. Dieser ändert sich aber immer. Das Programm liest eine Textdatei ein und speichert einen Abschnitt von drei Zeichen in der Variable var.
Deswegen kann ich nicht einfach WHERE Schluessel1='text' schreiben.


----------



## Camino (20. Jan 2012)

Schau doch mal in der Datenbanktabelle nach, was das Feld Schluessel1 ist.


----------



## Maxder (20. Jan 2012)

In der Spalte Schluessel1 stehen Zeichen(Buchstaben und Zeichen gemischt)


----------



## Maxder (20. Jan 2012)

Schluessel1 ist die dritte Spalte.


----------



## Camino (20. Jan 2012)

Wie ist das Feld denn definiert? Als varchar?


----------



## Maxder (20. Jan 2012)

Nein als Text.


----------



## Maxder (20. Jan 2012)

Ich habe meine Datenbank mit Access geschrieben, da kann man ein Feld nicht als Varchar definieren nur als:
Text
Memo
Zahl
Datum/Uhrzeit
Währung
Autowert
Ja/Nein
OLE-Objekt
Hyperlink
Anlage
Berechnet
Nachschlage Assistent


----------



## Camino (20. Jan 2012)

Also, beim Googeln nach der Fehlermeldung hab ich das gefunden:


> ODBC Error Code = 07001 (Wrong number of parameters)
> 
> [Microsoft][ODBC Microsoft Access Driver]COUNT-Feld ungültig.
> 
> Hint: The cause of this error is usually that your query contains a reference to a field which does not exist. You should verify that the fields included in your query exist and that you have specified their names correctly.


----------



## Maxder (20. Jan 2012)

Ich habe jetzt vor der SELECT Abfrage var manuell als $%$ festgelegt, das ist der Wert der in der Spalte Schluessel1 in der 1.Zeile steht, aber es kommt genau die selbe Fehlermeldung. Und die Spalte heist definitiv Schluessel1.


----------



## Camino (20. Jan 2012)

Äh, in der Spalte soll der Text "$%$" stehen? Nicht, dass das irgendwelche reservierten Steuerzeichen für irgendwas sind. Ansonsten fällt mir gerade auch nicht viel mehr ein...


----------



## Maxder (20. Jan 2012)

Wenn ich statt $%$ aaa in die Datenbank schreibe und var als aaa definiere ändert sich auch nichts


----------



## Camino (20. Jan 2012)

Aber ganz oben hattest du doch geschrieben:


> Wenn ich aber den aktuellen Wert von var manuell in die SELECT Abfrage eingebe funktioniert alles:
> String sqlString="SELECT * FROM Tabelle1 WHERE Schluessel1='$%$'";


----------



## Annold (20. Jan 2012)

Weil die Liste ja mit Access angefertigt wurde, kannst nicht einfach die ID's benutzen?


----------



## SlaterB (20. Jan 2012)

mal grundsätzlich



> String sqlString="SELECT * FROM Tabelle1 WHERE Schluessel1='$%$'";
> 
> Das Problem ist nur, dass var sich je nach vorangehender Ereignisse ändert und vom Programm festgelegt wird, deshalb muss ich die Variable an sich in die SELECT Abfrage reinschreiben.


wenn du einfach einen String zusammenbaust, etwa

```
String sqlString="SELECT * FROM Tabelle1 WHERE Schluessel1='"+var+"'";
```
müsste das zumindest schon variabel sein, und der String ist je nach Inhalt von var nicht mehr von einem komplett manuell erzeugten String zu unterscheiden

allgemein ist natürlich richtig dass man lieber PreparedStatement verwenden sollte,
aber wie funktioniert es mit String-Zusammenbau?


----------



## HimBromBeere (20. Jan 2012)

bin nur kurz über das Thema geflogen... wenn du einen SQL-String zusammenbauen willst, solltest du am besten preparedStatements verwenden (Galileo Computing :: Java ist auch eine Insel – 22.10 Vorbereitete Anweisungen (Prepared Statements)). Das ist am einfachsten und v.a. am sichersten (Stichwort SQL-Injection).


EDIT: Heißt die Spalte schluessel1 odr Schluessel1? SQL ist soweit ich weiß case-sensitive, also müsstest du im weiten Fall schreiben 
	
	
	
	





```
WHERE "Schluessel1" = ...
```
, also in Anführungszeichen


----------



## Evil-Devil (20. Jan 2012)

HimBromBeere hat gesagt.:


> EDIT: Heißt die Spalte schluessel1 odr Schluessel1? SQL ist soweit ich weiß case-sensitive, also müsstest du im weiten Fall schreiben
> 
> 
> 
> ...



Wenn schon mit ` und nicht mit "
[sql]where `Schluessel1`[/sql]

Da es ja Access und kein SQL ist und Windoof selbst nicht zwischen Groß- und Kleinschreibung unterscheidet ist das zumindest bei Access egal. Aber alles klein schreiben sollte man trotzdem.


----------



## SlaterB (20. Jan 2012)

Evil-Devil hat gesagt.:


> Wenn schon mit ` und nicht mit "
> [sql]where `Schluessel1`[/sql]


vielleicht wählst du das bewusst so, aber ist das dann nicht einen Kommentar wert?
allgemein ist ` doch kein sinnvolles Zeichen, musste ich auch erst auf der Tastatur suchen

überall ist doch wohl ' das Standard-einfache-Anführungszeichen, etwa auch in Java
[sql]where 'Schluessel1'[/sql]


----------



## Evil-Devil (20. Jan 2012)

Wenn man es direkt in Java schreibt mag das klappen. Das ` ist allerdings afaik das offizielle Zeichen zum escapen von Bezeichnern in SQL.

Sonst würden ja nicht diverse SQL Tools entsprechende Statements erzeugen.

z.B.
[sql]select `user_id`, `timestamp` as `reg_time` from `users`[/sql]

Wie gesagt, spätestens bei Schlüsselwörtern kann es zu Problemen kommen. Und mit ' wird in SQL eine Zeichenkette beschrieben. Das man damit Spalten anspricht habe ich noch nie gesehen.

[edit]Ok, kurze Google Suche hat ergeben das nahezu jede SQL Distri ihre eigene Suppe kocht. Von ", `, [] bis ' ist nahezu alles dabei und konfigurierbar[/edit]


----------



## SlaterB (20. Jan 2012)

Evil-Devil hat gesagt.:


> Und mit ' wird in SQL eine Zeichenkette beschrieben. Das man damit Spalten anspricht habe ich noch nie gesehen.


stimmt auch wieder


----------



## HimBromBeere (20. Jan 2012)

> Ok, kurze Google Suche hat ergeben das nahezu jede SQL Distri ihre eigene Suppe kocht. Von ", `, [] bis ' ist nahezu alles dabei und konfigurierbar



Will ich doch meinen... "spaltenname" hab ich genauso schon gesehen wie 'spaltenname' und `spaltenname` (wobei Letzres am hässlichesten aussieht, jetzt mal von der reinen Äthestik )

EDIT: Ist dazu im SQL-Standard nichts gesagt?


----------



## Evil-Devil (20. Jan 2012)

Der SQL Standard legt die Gänsefüße vor. Allerdings sagt er auch das man es nach belieben konfigurieren kann.


----------



## xehpuk (20. Jan 2012)

So habe ich auch gedacht, bis ich auf MySQL traf, wo anscheinend 
	
	
	
	





```
`
```
 der Standard zu sein scheint, 
	
	
	
	





```
'
```
 aber auch möglich ist.

_Huch, irgendwie Seite 2 nicht gesehen. _


----------



## Maxder (23. Jan 2012)

Ich habe es doch noch im Internet gefunden, ich muss die Select Abfrage einfach so schreiben und das Prepared Statement weglassen: 
SELECT * FROM Tabelle1 WHERE Klartext='" + var + "'"


----------



## SlaterB (23. Jan 2012)

wie ich auch am 20.01.2012, 13:32 geschrieben habe


----------



## Maxder (23. Jan 2012)

Das hatt ich ja auch probiert nur du hast es ohne die Leerzeichen geschrieben und das hat iwie nicht funktioniert.


----------



## SlaterB (23. Jan 2012)

dies verstehe ich nicht, aber ist letztlich auch ganz egal,


----------

