Datenbankabfrage -> Column not found

Alex Großmann

Erfahrenes Mitglied
Hiho,

ich spiel ja mit den Parametern herum, nun wollt ich ne Stinknormale Datenbank abfrage machen...

Ich nutze folgende Datenbank:

DB : ODBC-Datenquelle - MS-Access
Driver : Sun-ODBC

So nun folgendes, in ner Tabelle steht die Zeilenbame mit dem Inhalt "Otto" darunter, daneben sein Geburstag, die Zeile heißt Geburstag. Natürlich finden sich noch andere Namen und Geburstage darin wieder, aber wir nehmen mal Beispielsweise Otto...
Nun wollt ich in ne Variable seinen Geburstag schreiben und ausgeben. Leider funktioniert das noch nicht ganz, aber schaut selbst:

Die Verbindung zur Datenbank besteht 100%ig...
Java:
try {	Statement stmt1 = con.createStatement();
			ResultSet rs1 = stmt1.executeQuery("select * from daten");
			System.out.println("Statement wurde erstellt....");
			
			try {
				bday= rs1.getString("SELECT Geburstag FROM daten WHERE Name LIKE 'Otto'");

Als Fehler kommt die java.sql.SQLException: Column not found

Das ist äußerst merkwürdig da die Zeilen ect. 100% so heißen?
Hat jemand eine Idee? Vielen Dank im Vorraus!
 
ResultSet.getString() erwartet den Spaltennamen.
Nach einigen Themen, die du hier schon aufgemacht hast stelle ich immer wieder fest, dass dir das Grundsätzliche Verständis fehlt, zu dem, was du eigentlich tust. In deinem Code oben holst du dir erst alle Zeilen aus der Tabelle "daten" und willst dir dann den Wert der ersten Zeile mit einem extra langen Spaltennamen, vorausgesetzt man könnte soetwas rein theoretisch überhaupt als Spaltennamen setzen. Möchtest du also den Geburtstag von Otto haben, musst du dir erst alle Zeilen holen, wo der Name Otto ist und dir dann die Spalte raussuchen.

Java:
ResultSet rs1 = stmt1.executeQuery("SELECT * FROM daten WHERE name LIKE 'Otto'");
bday = rs1.getString("Geburtstag");

Was mir nicht ganz klar wird, wieso nimmst du LIKE? LIKE wird normalerweise nur im Zusammenhang mit einem Pattern (z.B. Wildcards) benutzt...
 
Zuletzt bearbeitet:
Ähm ... wie Honni schon sagte : dir fehlt hier einiges an Grundwissen.

Wie bereits erwähnt holst du dir über die Query ALLE Spalten. ResultSet.getString() erwartet aber jetzt entweder einen Index oder den Spaltennamen ... aber KEIN Query.
Auch stimmt oben das Query schon garnicht. Wenn überhaupt dann so:
Java:
Statement.executeQuery("SELECT * FROM `daten`");
Wobei du ja nur die Spalte "gerburtstag" *ich habe es dir schon mal gesagt : schreibe Datenbanken, Tabellen und Spaltennamen einfach KLEIN ... dann gibts keine Probleme* müsste dein Query dann so aussehen:
Java:
Statement.executeQuery("SELECT `gerburtstag` FROM `daten`");
Was du natürlich wieder voll ignoriert hast und was ich dir bereits auch schon sagte : QUOTING !

Warum dir nun der JDBC-Driver eine SQLException wirft ist ganz klar :
es gibt halt keine Spalte die "SELECT Geburtstag FROM daten WHERE Name LIKE 'Otto'" heißt.
Wenn du nun also die Spalte "geburtstag" von einer bestimmten Person haben willst geht das so
Java:
Connection con=DriverManager.getConnection();
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("SELECT `geburtstag` FROM `daten` WHERE `name`='Otto'");
String gtag=rs.getString(1); //Index beginnt bei 1 NICHT bei 0
 
Optimal! 1000 Dank Honni :)
Macht auch so viel mehr Sinn da hast du Recht!
Falls mal einer durch Google/Forensuche vorbei schaut, die Lösung lautet also:

Java:
try {   Statement stmt1 = con.createStatement();
            ResultSet rs1 = stmt1.executeQuery("select Geburstag from daten where Name like 'Otto'");
            System.out.println("Statement wurde erstellt....");
            
            try {
                bday= rs1.getString("Geburstag");

Danke nochmals Honni!

@ Spike, auch danke, jedoch gehts auch wunderbar ohne Quotes ;) Und in keiner Anleitung werden wirklich Quotes verwendet, außer eben das nach dem like :)
 
Quotes werden aus einem Grund gerne weggelassen : weil man eigentlich alles zusammenschreibt. Mit Quotes hast du aber auch die möglichkeit Leerzeichen mit drin zu haben wobei sich das aber vom Design her nur bei Werten innerhalb der Tabelle lohnt.
 
Durch Quotes kann man auch verbotene Namen verwenden, wie alter. Ohne Quotes werden diese dann nämlich sonst als Befehl interpretiert und alle wundern sich warum nen Fehler sich mit einem anfreunden möchte. Bei Quotes kann sowas nicht passieren. Ist also im Fall der Fälle eine zusätzliche Sicherheit.
 
Auch mal davon abgesehen das im offiziellen SQL-Standard die Quotes sogar vorgeschrieben sind. Auch ist dort genannt welche Quotes für welches "Felder" zu verwenden sind : nämlich ' ' für Werte und ` ` für Datenbanken-, Tabellen- und Spaltennamen.
 
Auch mal davon abgesehen das im offiziellen SQL-Standard die Quotes sogar vorgeschrieben sind. Auch ist dort genannt welche Quotes für welches "Felder" zu verwenden sind : nämlich ' ' für Werte und ` ` für Datenbanken-, Tabellen- und Spaltennamen.

Vorgeschrieben? Ich wundere mich die ganze Zeit warum ich ständig in Syntax Fehler laufe, wenn ich Quotes bei Datenbank-, Tabellen- und Spaltennamen beim Microsoft SQL Manager nutze. Dabei habe ich sowohl ' als auch `sogar ´und " ausprobiert. Nichts funktioniert, lediglich ohne Quotes geht es. Wie kann das sein :/
 
Hmm ... eine einfach Antwort wäre hier wohl : seit wan hält sich M$ an irgendwelche Standards ?
Ich sage nur : Internet Explorer , Internet Information Server oder wie in deinem Beispiel M$ SQL Server / Manager.
Der Witz an der Sache : es funktioniert bei ALLEN anderen DB-Systemn *MySQL , SQLite , PostgreSQL , HDB2* ... nur mal wieder nicht bei M$-Schrott.
 
Zurück