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

Maxder

Mitglied
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
 
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.
 
Vielleicht ist Schluessel1 kein String sondern einen Zahl (Integer)? Dann musst du natürlich beim PreparedStatement einen Integerwert und keinen String übergeben.
 
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.
 
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
 
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.
 
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.
 
Ä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...
 
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
Java:
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?
 
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
SQL:
WHERE "Schluessel1" = ...
, also in Anführungszeichen
 
Zuletzt bearbeitet:
EDIT: Heißt die Spalte schluessel1 odr Schluessel1? SQL ist soweit ich weiß case-sensitive, also müsstest du im weiten Fall schreiben
SQL:
WHERE "Schluessel1" = ...
, also in Anführungszeichen

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.
 
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]
 
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]
 
Zuletzt bearbeitet:
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?
 
Zuletzt bearbeitet:
So habe ich auch gedacht, bis ich auf MySQL traf, wo anscheinend
Code:
`
der Standard zu sein scheint,
Code:
'
aber auch möglich ist.

Huch, irgendwie Seite 2 nicht gesehen. 😳
 
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 + "'"
 

Zurück
Oben