2 Stimmen

Was ist falsch mit meiner JDBC mySQL-Anweisung? Offenbar ist meine WHERE-Klausel durcheinander

Was ist falsch mit meiner JDBC mySQL-Anweisung? Offenbar ist meine WHERE-Klausel durcheinander geraten. Hinweis: Der erste Wert ist im actionListener definiert und der =-Wert ist die Variable in der Datenbank.

searchBtn.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
        list.clearSelection();

        //connect to database

        String afName= auth_fName.getText();
        String aMI =  auth_MI.getText();
        String alName = auth_lName.getText();

        String tField = titleField.getText();
        String sField = subjectField.getText();

        //PR.111.002 - “Core Java”,  Cay Horstmann  - AVAILABLE

        try
        {
            Connection conn = Database.getConnection();

            Statement s = conn.createStatement();

            if (!afName.equals("") && (!aMI.equals ("")) && (!alName.equals(""))&& (!tField.equals("")) && (!sField.equals("")))
            {
                selectString = "SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availability"
                                + "FROM book, transaction"
                                + "WHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI'"
                                + " AND title = 'title' AND sField = 'subject'";
                result ="";

            }

            s = conn.createStatement();
            ResultSet rs = s.executeQuery(selectString);
            while (rs.next())
                {
                    String call_Number = rs.getString("call_Number");
                    String title = rs.getString("title");
                    String auth_lName = rs.getString("auth_lName");
                    String auth_MI = rs.getString ("auth_MI");
                    String auth_fName = rs.getString("auth_fName");
                    String availability = rs.getString("availability");

                view = new View (call_Number, title, auth_lName, auth_MI, auth_fName, availability);

                vList.add(view);
                }
        s.close();
        conn.close();

        list.setListData(vList.toArray());

        } catch (Exception ex) {

            ex.printStackTrace();
        }
    }
});

4voto

BalusC Punkte 1034465

Sie haben einige Leerzeichen vergessen.

Ersetzen Sie

selectString = "SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availability"
    + "FROM book, transaction"
    + "WHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI'"
    + " AND title = 'title' AND sField = 'subject'";

von

selectString = "SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availability"
    + " FROM book, transaction"
    + " WHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI'"
    + " AND title = 'title' AND sField = 'subject'";

Bei zukünftigen SQL-Problemen hilft es Ihnen sehr, wenn Sie die SQL-Anweisung oder die PreparedStatement bevor sie ausgeführt wird. Diese Art von Fehlern kann dann leichter erkannt werden.

logger.debug(selectString);

Unverwandt für das konkrete Problem, müssen Sie DB-Ressourcen schließen, einschließlich ResultSet im finally Block des try Block, in dem sie erworben wurden. Auf diese Weise verhindern Sie, dass im Falle von Ausnahmen Ressourcen verloren gehen.

4voto

James.Xu Punkte 8101
    selectString = "SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availability"
                + "FROM book, transaction"
                + "WHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI'"
                + " AND title = 'title' AND sField = 'subject'";

Das Problem ist, dass Sie kein Leerzeichen zwischen Transaktion y WHERE ...

2voto

MBCook Punkte 14110

OK, ich sehe es. Es ist nicht genau die Where-Klausel, das ist nur das, worauf der Parser zeigt. Es ist in der Nähe von die Where-Klausel. So sieht Ihr SQL aus, wenn Sie die Zeilenumbrüche entfernen:

SELECT call_Number, title, auth_lName, auth_fName, auth_MI, availabilityFROM book, transactionWHERE aLName = 'auth_LName' AND afName = 'auth_FName' AND aMI = 'auth_MI' AND title = 'title' AND sField = 'subject'

Das Problem ist, dass Sie keine Leerzeichen zwischen "Verfügbarkeit" und "FROM" oder zwischen "Transaktion" und "WHERE" haben. Wenn Sie am Ende jeder Zeile Leerzeichen einfügen, sollte es funktionieren.

Solche Fehler passieren immer wieder. Ich habe mir angewöhnt, am Ende jeder Zeile einer SQL-Abfrage in meinen Anwendungen ein zusätzliches Leerzeichen einzufügen, um zu verhindern, dass ich dies versehentlich tue, wenn ich eine Abfrage später ändere.

Beachten Sie auch, dass "Transaktion" ein reserviertes Wort ist. Obwohl Sie keine Probleme zu haben scheinen, könnten Sie in Zukunft versehentlich auf eines stoßen, bei dem der Parser es als Schlüsselwort statt als Tabellen-/Feldname interpretiert. Ein Zitat (mit Backticks in MySQL) hilft in diesem Fall, aber wenn es möglich ist, können Sie es auch umbenennen. Diese "Ich habe versehentlich ein Schlüsselwort als Namen verwendet"-Fehler können sehr mühsam aufzuspüren sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X