2016-05-19 36 views
-1

Ich halte die folgende Fehlermeldung erhalten:Fehler: kann nicht Symbol finden PreparedStatement

error: cannot find symbol PreparedStatement st = conn.prepareStatement("SELECT * FROM table WHERE name = ?"); 
symbol: variable conn 
location: class splitString 

Hier ist der Code, den ich mit

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 

class splitString { 
    public static void main(String[] args) { 

    //Connect to database 
    try { 
     Class.forName("org.postgresql.Driver"); 
     Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/database", "postgres", "pswd"); 
     if (con != null) 
      System.out.println("Connection Successful!"); 
    } catch(Exception ee) { 
     ee.printStackTrace(); 
    } 

    String word = "Apples"; 
    PreparedStatement st = conn.prepareStatement("SELECT * FROM table WHERE name = ?"); 
    st.setString(1, word); 
    ResultSet rs = st.executeQuery(); 

    } 
} 

ich das Wort „Apfel“ in der Datenbank nachschlagen möchten Verwenden Sie die Variable namens "Wort".

Kann mir jemand sagen, was ich falsch mache?

+1

Sie haben 'con' und nicht 'conn' deklariert, außerdem bleibt der Umfang von 'con' in try Block. – Shail016

+0

Versuchen Sie IDE zu verwenden, die diese Probleme hervorheben würde, und Sie wären in der Lage, diese ohne Hilfe von anderen selbst zu lösen. – Helios

Antwort

0

ändern

Connection con=DriverManager.getConnection("jdbc:postgresql://localhost/database", "postgres", "pswd"); 

zu

Connection conn=DriverManager.getConnection("jdbc:postgresql://localhost/database", "postgres", "pswd"); 

und fügen Sie nicht Class.forName("org.postgresql.Driver"); Connection con=DriverManager... in Try-Catch-Block. hoffen, dass es :)

+0

Class.forName und DriverManager beide (denke ich) müssen in einem Versuch Catch sein, aber die Erklärung der Verbindung sollte außerhalb des Versuches sichtbar sein (nur um klar zu sein;)) – AxelH

+0

, wenn Sie sowohl class.forName & Drivermanager im Versuch-Fang kannst du sie darin haben. aber dann müssen Sie Verbindungsobjekt Con außerhalb Try-Catch zu definieren, sonst wird es Verbindungsobjekt zu dem Zeitpunkt nicht erkennen Sie es verwenden. (Das ist vorbereitet, wo Sie Fehler bekommen) –

+0

Das ist nicht für mich, aber ich sage, dass DriverManager.getConnection SQLException wirft und Class.forName ClassNotFoundException wirft, müssen beide fangen oder zurückwerfen. Und wenn einer von denen eine Ausnahme auslöst, ist die Verbindung nicht möglich, so dass Sie nicht versuchen müssen, ein PreparedStatement für einen Nullwert zu erstellen. – AxelH

0

Wie sagen @ Shail016 helfen Sie Tippfehler im Namen von Connection Im Folgenden festgelegten Code mit einigen zusätzlichen Try-Catch-Blöcken

package main; 

import java.sql.*; 

class splitString { 
    public static void main(String[] args) { 

     //Connect to database 
     Connection con = null; 
     String word = "Apples"; 

     try { 
      Class.forName("org.postgresql.Driver"); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
     try { 
      con = DriverManager.getConnection("jdbc:postgresql://localhost/database", "postgres", "pswd"); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     if (con != null) 
      System.out.println("Connection Successful!"); 
     else return; 

     PreparedStatement st; 
     ResultSet rs = null; 
     try { 
      st = con.prepareStatement("SELECT * FROM table WHERE name = ?"); 
      st.setString(1, word); 
      rs = st.executeQuery(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
0

Da niemand haben die Try-with-Ressource verwendet wird, diese ist, wie man es mit der autocloseable Klasse macht. (Wenn jemand es auf einem Java 7 testen oder mehr, ich arbeite auf 1.6 hier ...)

try { 
    Class.forName("org.postgresql.Driver"); 
} catch (ClassNotFoundException e) { 
    e.printStackTrace(); 
    return; 
} 

try(
    Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/database", "postgres", "pswd"); 
    PreparedStatement st = con.prepareStatement("SELECT * FROM table WHERE name = ?"); 
){ 
    st.setString(1, word); 
    try(rs = st.executeQuery();){ 
     //Read the resultset 
    } 
} 

Dies wird das connectionm preparedStatement und das Ergebnis automatisch nach Gebrauch schließen. Dies ist eine gute Annäherung