2009-07-17 6 views
1

Hier ist eine Klasse, die PreparedStatements für eine Verbindung ausführt.SQLException: JZ0S4: Kann keine leere (Null-Länge) Abfrage ausführen. für eine vorbereitete Anweisung

public class doSomething { 
    private PreparedStatement ps; 

    public setPS (Connection conn) throws SQLException { 
     String sql = "select * from table where id = ?"; 
     ps = conn.prepareStatement(sql); 
    } 

    public void runSomething(String var){ 
     ps.setString(1,var); 
     ResultSet rs = ps.executeQuery(); 
     ... 
    } 
} 

Ich nenne

doSomethingInstance.setPS(conn); 
doSomethingInstance.runSomething(var); 

von einer anderen Klasse, und dies wirft und Ausnahme an der

ResultSet rs = ps.executeQuery(); 

Die Ausnahme ist SQLException: JZ0S4: Kann nicht eine leere (Länge Null) Abfrage ausführen . auf einer vorbereiteten Aussage. Ich verstehe nicht warum. Sieht jemand was ich hier falsch mache?

Danke!

+0

sehr seltsam ... wenn die Anweisung wirklich leer war, sollte setString() nicht zuerst funktionieren. Sind Sie sicher, dass das der richtige/vollständige Code ist? ("public setPS (..." sollte nicht kompilieren: fehlender Rückgabetyp.) Ich weiß nicht, welche Datenbank Sie verwenden, aber "Tabelle" ist kein sehr guter Name für eine Tabelle, es ist ein reserviertes Schlüsselwort (zumindest MySQL)) –

Antwort

1

Dieses Problem wurde behoben Leute. Es gab ein Problem mit den Datenbankberechtigungen. Abfangen und Drucken der Stacktrace auf

ResultSet rs = ps.executeQuery(); 

angezeigt, dass die Tabelle, auf die von der Abfrage zugegriffen wird, nicht gefunden wurde. Ich muss noch herausfinden, warum die SQLException: JZ0S4: Kann keine leere (Null-Länge) Abfrage ausgeführt wird geworfen werden.

Vielen Dank für Ihre Zeit und Rücksicht. Rohan

0

Können Sie den Inhalt von SQL vor dem Ausführen der Abfrage drucken? Ich vermute, dass es seinen Inhalt verliert

+0

@rohangter: Ich kenne diese API nicht, aber führen Sie eine andere Abfrage als Sie vorbereitet? –

1

Gehen Sie zurück und kopieren Sie den Code direkt aus Ihrer Quelldatei, dann bearbeiten Sie Ihre Frage. Sie haben eine potentielle Mehrdeutigkeit: Ihr erstes Fragment ruft die vorbereitete Anweisung "preparedStatement" auf, dann wechseln Sie zu "prepareStatement" (ohne das "d"). Ein sauberer Blick auf Ihren Quellcode erleichtert das Isolieren des Problems. Haben Sie zwei Variablen oder haben Sie Ihr Beispiel falsch eingegeben?

[später ...] Vielen Dank für die Aktualisierung Ihres Codes. Ich sehe kein offensichtliches Problem damit. Sind Sie mit einem Debugger (z. B. in Eclipse) durchgegangen, um sicherzustellen, dass die beiden Methoden wie erwartet aufgerufen werden?

+0

Ich entschuldige mich.Ich habe den Objektnamen behoben.Es ist im Grunde das gleiche PreparedStatment Handle von beiden Methoden verwendet. –

0

Ist var nicht null? Ist var des richtigen Typs (Int anstelle von String würde ich denken?)